我正在创建一个承载客户端页面的多租户网站。 URL的第一部分将是一个字符串,识别客户端,使用下面的URL路由方案在Global.asax中定义:如何重定向到ASP.NET MVC中的动态登录URL
"{client}/{controller}/{action}/{id}"
这工作得很好,用的URL如/富/首页/索引。
但是,当使用[Authorize]属性时,我想重定向到也使用相同映射方案的登录页面。因此,如果客户端是foo,登录页面将是/ foo/Account/Login,而不是web.config中定义的固定/帐户/登录重定向。
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 }
});
}
}
}
具有路由做几乎同样的事情,所以我需要这个!谢谢! – 2008-12-27 21:20:41
谢谢,我试图弄清楚如何做类似的事情。 – Chance 2010-02-03 02:34:06
它给了我自己实现的想法,非常感谢! – 2010-10-31 16:47:08