在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以某种方式应用?
答案 0 :(得分:2)
正如你所说,这三种重定向方式属于不同的部分:WebForms,MVC,OWIN。它们中的每一个都可以独立于另一个使用(OWIN在自托管情况下),因此需要在它们的每一个中做同样的事情。
但是我不完全确定为什么最新的MVC模板需要RedirectToLocal
。我会采用向后兼容性 - 这种方法已存在很长时间了。
此外,OWIN重定向在MVC中没有获胜 - 在我的一个应用程序中,我总是根据用户的角色重定向用户,即使有一个带有本地URL的参数,我的用户也总是在指定的页面上在MVC控制器中。
但是,看过OWIN源代码和重定向逻辑后,MVC获胜似乎很奇怪。可能需要一步一步地向下看,看看MVC场景中会发生什么。