我正在创建一个为客户托管页面的多租户网站。URL 的第一段将是一个标识客户端的字符串,在 Global.asax 中使用以下 URL 路由方案定义:
"{client}/{controller}/{action}/{id}"
这可以正常工作,使用 /foo/Home/Index 等 URL。
但是,当使用 [Authorize] 属性时,我想重定向到也使用相同映射方案的登录页面。因此,如果客户端是 foo,则登录页面将是 /foo/Account/Login 而不是 web.config 中定义的固定 /Account/Login 重定向。
MVC 使用 HttpUnauthorizedResult 返回 401 未授权状态,我认为这会导致 ASP.NET 重定向到 web.config 中定义的页面。
那么有人知道如何覆盖 ASP.NET 登录重定向行为吗?还是通过创建自定义授权属性在 MVC 中重定向会更好?
编辑 - 回答:在深入研究 .Net 源代码后,我决定自定义身份验证属性是最佳解决方案:
public class ClientAuthorizeAttribute: AuthorizeAttribute
{
public override void OnAuthorization( AuthorizationContext filterContext )
{
base.OnAuthorization( filterContext );
if (filterContext.Cancel && filterContext.Result is HttpUnauthorizedResult )
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "client", filterContext.RouteData.Values[ "client" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}