如何重定向到ASP.NET MVC中的动态登录URL
我正在创建一个为客户提供页面的多租户网站。 URL的第一部分将是一个字符串,标识客户端,使用以下URL路由方案在Global.asax中定义:
"{client}/{controller}/{action}/{id}"
这可以正常工作,具有诸如/ foo / Home / Index之类的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 }
});
}
}
}
我认为主要的问题是,如果你要搭载内置的ASP.NET FormsAuthentication类(并且没有什么好的理由你不应该这样做),那么在一天结束时就会调用FormsAuthentication.RedirectToLoginPage()
这将看看一个配置的URL。 以前只有一个登录网址,这就是他们设计的方式。
我试图解决这个问题(可能是Rube Goldberg的实现)就是让它重定向到所有客户端共享的根目录中的单个登录页面,比如/ account / login。 此登录页面实际上不会显示任何内容; 它会检查ReturnUrl参数或我在会话中获得的某个值,或者是一个标识客户端的cookie,并使用它来立即发送302到指定/客户端/帐户/登录页面的重定向。 这是一个额外的重定向,但可能不明显,它允许您使用内置的重定向机制。
另一种选择是按照您的描述创建您自己的自定义属性,并避免在FormsAuthentication
类中调用RedirectToLoginPage()
方法的任何内容,因为您将使用自己的重定向逻辑来替换它。 (你可以创建自己的类。)由于它是一个静态类,我没有意识到任何机制,你可以注入自己的替代接口,并让它神奇地与现有的[Authorize]属性一起工作,打击,但人们以前做过类似的事情。
希望有所帮助!
在ASP.NET MVC的RTM版本中,Cancel属性丢失。 此代码适用于ASP.NET MVC RTM:
using System;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Resources;
namespace ePegasus.Web.ActionFilters
{
public class CustomAuthorize : AuthorizeAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
base.OnAuthorization(filterContext);
if (filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(
new System.Web.Routing.RouteValueDictionary
{
{ "langCode", filterContext.RouteData.Values[ "langCode" ] },
{ "controller", "Account" },
{ "action", "Login" },
{ "ReturnUrl", filterContext.HttpContext.Request.RawUrl }
});
}
}
}
}
编辑:您可能想要禁用web.config中的默认表单身份验证loginUrl - 以防有人忘记您拥有自定义属性并错误地使用内置的[Authorize]属性。
修改web.config中的值:
<forms loginUrl="~/Account/ERROR" timeout="2880" />
然后制作一个操作方法'错误',记录一个错误并将用户重定向到您最常用的登录页面。
我对这个问题的解决方案是一个自定义的ActionResult
类:
sealed public class RequiresLoginResult : ActionResult
{
override public void ExecuteResult (ControllerContext context)
{
var response = context.HttpContext.Response;
var url = FormsAuthentication.LoginUrl;
if (!string.IsNullOrWhiteSpace (url))
url += "?returnUrl=" + HttpUtility.UrlEncode (ReturnUrl);
response.Clear ();
response.StatusCode = 302;
response.RedirectLocation = url;
}
public RequiresLoginResult (string returnUrl = null)
{
ReturnUrl = returnUrl;
}
string ReturnUrl { get; set; }
}
链接地址: http://www.djcxy.com/p/71765.html
上一篇: How to redirect to a dynamic login URL in ASP.NET MVC
下一篇: = '.';"?