我正在创建一个多租户网站,为客户托管页面。URL的第一段将是标识客户端的字符串,该字符串使用以下URL路由方案在Global.asax中定义:
"{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 }
});
}
}
}