我正在创建一个多租户网站,为客户托管页面.URL的第一段将是一个字符串,用于标识在Global中定义的客户端.asax使用以下URL路由方案:
"{client}/{controller}/{action}/{id}"
这在使用/foo/Home/Index等URL时效果很好.
然而,当使用[Authorize]属性时,我想重定向到一个同样使用相同映射方案的登录页面.因此,如果客户端是foo,那么登录页面将是/foo/Account/login,而不是web中定义的固定/Account/login重定向.配置.
MVC使用HttpUnauthorizedResult返回401 Unauthorized状态,我认为这会导致ASP.NET重定向到web中定义的页面.配置.
那么,有人知道如何覆盖ASP.网络登录重定向行为?还是通过创建自定义授权属性在MVC中重定向更好?
EDIT - Answer:在深入研究了.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 }
});
}
}
}