在 ASP.NET MVC 项目中,当您使用 [Authorize] 装饰类或方法并且授权失败时,站点会自动重定向到登录页面(使用 web.config 中指定的 loginUrl)。此外,ASP.NET MVC 框架中的某些内容将原始请求的 URL 作为 ReturnUrl 参数传递。
是什么负责附加此 ReturnUrl?我在项目模板中找不到任何代码。我还查看了 ASP.NET 堆栈源代码中 AuthorizeAttribute 的代码,但在那里找不到任何东西。我还尝试在整个 ASP.NET 堆栈源代码中搜索“returnurl”,但找不到任何东西。
我问的原因是我在这个过程中发现了一个错误。您可以通过一个全新的 Internet ASP.NET MVC 项目看到这一点。在 web.config 中将 FormsAuth 超时设置为 1 分钟,然后登录。等待一分钟,然后尝试退出。这将重定向到带有 /account/logoff 的 ReturnUrl 的登录页面,登录后会导致 404。我现在已经使用自己的 AuthorizeAttribute 解决了这个问题:
public class MyAuthorizeAttribute : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
{
string returnUrl = null;
if (filterContext.HttpContext.Request.HttpMethod.Equals("GET", System.StringComparison.CurrentCultureIgnoreCase))
returnUrl = filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary()
{
{ "client", filterContext.RouteData.Values[ "client" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", returnUrl }
});
}
}
}
但是,我想看看源代码,看看我是否可以弄清楚为什么这个错误存在,如果它确实是一个错误。