为什么在具有owin / identity的asp.net web应用程序中重复的returnUrl重定向逻辑?

时间:2014-12-03 19:41:06

标签: asp.net asp.net-mvc asp.net-identity owin

在visual studio中创建新的Web应用程序(webforms或mvc)时,会有后验证逻辑,用于检查查询字符串中的ReturnUrl参数,然后将用户重定向到那里(如果存在): 在weforms - Login.aspx.cs中你有这个:

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

在MVC - AccountController.cs中你有这个:

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

此外,Owin配置设置为使用cookie身份验证,该身份验证使用Microsoft.Owin.Security.Cookies.CookieAuthenticationHandler类,该类本身检查ReturnUrl参数,并应用重定向(如果存在):

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);
            }
        }
    }
}

两个重定向似乎都在登录/身份验证请求期间执行。一个应用于HttpContext.Response,另一个应用于Owin重定向上下文。根据我的经验,看起来后者重定向调用胜出,如果您在网站代码中登录后应用了特殊的重定向逻辑,这是一个问题,因为它被内置的Owin重定向覆盖。

这种重复逻辑有充分的理由吗?这只是糟糕的设计吗?所以,如果我使用asp.net Owin CookieAuthentication,我应该在帐户控制器或后面的aspx代码上有登录后重定向代码逻辑吗?如果是这样,重定向应该应用于HttpContext.Response还是通过Owin以某种方式应用?

1 个答案:

答案 0 :(得分:2)

正如你所说,这三种重定向方式属于不同的部分:WebForms,MVC,OWIN。它们中的每一个都可以独立于另一个使用(OWIN在自托管情况下),因此需要在它们的每一个中做同样的事情。

但是我不完全确定为什么最新的MVC模板需要RedirectToLocal。我会采用向后兼容性 - 这种方法已存在很长时间了。

此外,OWIN重定向在MVC中没有获胜 - 在我的一个应用程序中,我总是根据用户的角色重定向用户,即使有一个带有本地URL的参数,我的用户也总是在指定的页面上在MVC控制器中。
但是,看过OWIN源代码和重定向逻辑后,MVC获胜似乎很奇怪。可能需要一步一步地向下看,看看MVC场景中会发生什么。