【问题标题】:MVC Customized Authentication filter not working as expectedMVC 自定义身份验证过滤器未按预期工作
【发布时间】:2015-03-28 18:31:10
【问题描述】:

我有 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] 装饰家庭和画廊控制器之后,它仍会重定向到帐户控制器!!

【问题讨论】:

  • AuthorizeCore 中的断点是否被命中?
  • 是的@praveenpaulose.. 但在它命中之前它将被路由到帐户控制器。
  • 如果你只需要允许匿名访问 home,gallery 为什么不从这些控制器中删除 Authorize 属性?
  • @praveenpaulose。我没有向主页、画廊或帐户控制器添加任何授权属性,并且我已经清楚地提到了这一点。
  • 很抱歉。监督。

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


【解决方案1】:

该行为是由于授权配置而发生的,即

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

从你的配置中删除这一行,之后它应该可以工作了。

您正在尝试混合使用 Web.config 中的授权和 MVC 中可用的 Authorize 属性。阅读此链接以明确回答不使用授权标签Authorize attribute vs authorization node in web.config

【讨论】:

  • 完美的兄弟。即使我也在考虑同样的问题,但后来我认为如果我将其包含在 Web 配置中,它将仅与那些具有授权或自定义身份验证属性的控制器相关,例如在我的案例管理员中。感谢您提供解释其中大部分内容的链接.. :)
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2016-04-11
  • 1970-01-01
相关资源
最近更新 更多