pourquoi la logique de redirection de returl dupliquée dans asp.net applications web avec owin / identity?

Lorsque vous créez une nouvelle application web (webforms ou mvc) dans visual studio, il est post-logique d'authentification qui vérifie une ReturnUrl param dans la chaîne de requête, puis redirige l'utilisateur s'il existe: Dans weforms-Login.aspx.cs vous avez ceci:

protected void LogIn(object sender, EventArgs e)
{
   ...
        switch (result)
        {
            case SignInStatus.Success:
                IdentityHelper.RedirectToReturnUrl(Request.QueryString["ReturnUrl"], Response);
                break;
            ...
        }
    }
}

dans MVC-AccountController.cs vous avez ceci:

[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
   ...
    switch (result)
    {
        case SignInStatus.Success:
            return RedirectToLocal(returnUrl);
        ...
    }
}

de plus, la configuration Owin est configurée pour utiliser l'authentification cookie, qui utilise le Microsoft.Owin.Sécurité.Cookies.CookieAuthenticationHandler class, qui lui-même vérifie un paramètre Returl, et applique une redirection si elle existe:

protected override async Task ApplyResponseGrantAsync()
{
    AuthenticationResponseGrant signin = Helper.LookupSignIn(Options.AuthenticationType);
    bool shouldSignin = signin != null;
    AuthenticationResponseRevoke signout = Helper.LookupSignOut(Options.AuthenticationType, Options.AuthenticationMode);
    bool shouldSignout = signout != null;

    if (shouldSignin || shouldSignout || _shouldRenew)
    {
        ...

        if ((shouldLoginRedirect || shouldLogoutRedirect) && Response.StatusCode == 200)
        {
            IReadableStringCollection query = Request.Query;
            string redirectUri = query.Get(Options.ReturnUrlParameter);
            if (!string.IsNullOrWhiteSpace(redirectUri)
                && IsHostRelative(redirectUri))
            {
                var redirectContext = new CookieApplyRedirectContext(Context, Options, redirectUri);
                Options.Provider.ApplyRedirect(redirectContext);
            }
        }
    }
}

les deux redirections semblent s'exécuter pendant la requête de connexion/authentification. Une est appliquée sur le HttpContext.Réponse, et l'autre appliqué sur le contexte de redirection Owin. D'après mon expérience, il semble que ce dernier appel de redirection gagne, ce qui est un problème si vous avez une logique spéciale de redirection appliquée post-connexion dans votre code du site Web parce qu'il est dépassé par la redirection Owin intégrée.

Est-il une bonne raison à cette double logique? Est-ce juste une mauvaise conception? Donc si j'utilise asp.net Owin CookieAuthentication, devrais-je avoir la logique de redirection de code post-connexion sur le contrôleur de compte ou le code aspx derrière? Et si oui, le rediriger être appliquée sur le HttpContext.Réponse ou par L'Intermédiaire D'Owin?

16
demandé sur Rafe 2014-12-03 22:41:05

1 réponses

comme vous l'avez dit, ces trois façons de rediriger tout appartiennent à des parties différentes: WebForms, MVC, OWIN. Chacun d'entre eux peuvent être utilisés indépendamment l'un de l'autre (OWIN dans l'auto-hébergement, situation), il est donc nécessaire de faire la même chose dans chacun d'eux.

cependant je ne suis pas entièrement sûr pourquoi le dernier modèle de MVC a besoin RedirectToLocal. J'utiliserais la rétrocompatibilité - cette méthode existe depuis des lustres.

aussi la redirection OWIN ne gagne pas dans MVC-in one de mes applications, je redirige toujours l'utilisateur en fonction de son rôle, même s'il y a un paramètre avec L'URL locale vers lequel aller, mes utilisateurs finissent toujours sur la page spécifiée dans le contrôleur MVC.

Cependant, après avoir regardé le code source OWIN et la logique de redirection, il semble étrange que MVC gagne. Probablement besoin de passer par tout le chemin vers le bas et voir ce qui se passe dans le scénario MVC.

2
répondu trailmax 2014-12-10 21:26:58