设置身份验证表单loginUrl动态?

Ban*_*hee 4 asp.net authentication asp.net-mvc

我有一个ASP.NET MVC站点,它使用表单身份验证和AuthorizeAttribute操作和控制器类上的自定义.

我在我的web.config文件中有这个:

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogOn" timeout="2880" />
</authentication>
Run Code Online (Sandbox Code Playgroud)

当网站处于"正常"模式时,这可以正常工作.需要登录的用户被重定向到此页面.

但是当我切换到测试模式时,所有控制器都将被锁定,并且还会锁定AccountController.

我现在需要在我处于测试模式时使用loginUrl来指向未锁定的控制器操作,这是针对测试场景的特殊操作.

如何更改loginUrl或者是否可以从AuthorizeAttribute?重定向?

Ric*_*ard 5

我们所做的是使用自定义的Authorize属性覆盖,该属性重定向HandleUnauthorizedRequest函数,如下所示:

public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute
    {

        public string LoginController { get; set; }
        public string LoginAction { get; set; }


        protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
        {
            if (string.IsNullOrEmpty(LoginController)&&string.IsNullOrEmpty(LoginAction))
                base.HandleUnauthorizedRequest(filterContext);
                    filterContext.Result =new RedirectToRouteResult(
                                            new RouteValueDictionary(new
                                                                         {
                                                                             controller = LoginController, 
                                                                             action = LoginAction, 
                                                                             returnUrl = HttpContext.Current.Request.Url
                                                                         }));
        }
    }
Run Code Online (Sandbox Code Playgroud)

这样,我们可以通过分配控制器和要执行的操作来为任何authorize属性指定登录路由.否则它的行为类似于标准的authorize属性.

您可以根据处于测试模式或实时模式将其更改为重定向.