MVC自定义身份验证筛选器未按预期工作

时间:2015-03-28 18:31:11

标签: c# asp.net-mvc authorization custom-authentication

我有4个控制器,即AccountAdminHomeGallery。在这4个控制器中,我只需要授权Admin控制器,剩下的可以匿名访问。所以我使用[AllowAnonymous]属性装饰了我的家庭控制器,图库控制器和帐户控制器,并且我的Admin控制器使用名为[CustAuthFilter]的自定义授权过滤器进行了装饰,它包含以下代码。

public class CustAuthFilter : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
      var request = httpContext.Request;
      string controller = request.RequestContext.RouteData.Values["controller"].ToString().ToLower();
      if (controller != "" && controller == "admin")
      {
          var isAuthorized = base.AuthorizeCore(httpContext);
          if (!isAuthorized)
          {
                return false;
          }
          else
          {
                if (!object.ReferenceEquals(httpContext.Session["un"], null))
                {
                      return true;
                }
                else
                {
                      return false;
                }
           }
       }
       else
       {
          return true;
       }
     }

     override public void OnAuthorization(AuthorizationContext filterContext)
     {
           base.OnAuthorization(filterContext);
           if (filterContext.Result is HttpUnauthorizedResult && filterContext.HttpContext.Request.IsAjaxRequest())
           {
               String url = System.Web.Security.FormsAuthentication.LoginUrl + "?X-Requested-With=XMLHttpRequest";
                filterContext.Result = new RedirectResult(url);
           }
     }

     protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
     {
        String url = System.Web.Security.FormsAuthentication.LoginUrl;
        filterContext.Result = new RedirectResult(url);
     }
}

在我的web.config中我已经关注

<authentication mode="Forms">
      <forms loginUrl="~/Account/Login" defaultUrl="~/Admin/Index" timeout="2880" protection="Encryption" slidingExpiration="true" cookieless="AutoDetect"/>
</authentication>
<authorization>
   <deny users="?"/>
</authorization>

我在过滤器中注册了我的自定义授权属性,如下所示:

filters.Add(new CustAuthFilter());

但每当我尝试访问domainname/homedomainname/gallery时,它都会自动重定向到domainname/account/login。但我不知道为什么即使用[AllowAnonymous]装饰家庭和画廊控制器后,它也会重定向到帐户控制器!!

1 个答案:

答案 0 :(得分:1)

由于授权配置,行为正在发生,即

<authorization>
    <deny users="?"/>
</authorization>

从配置中删除此行,之后应该正常工作。

您正在尝试混合Web.config中的授权和MVC中可用的Authorize属性。如果没有使用授权标记Authorize attribute vs authorization node in web.config

,请阅读此链接