MVC 自定义身份验证筛选器未按预期工作
MVC Customized Authentication filter not working as expected
我有 4 个控制器,即 Account
、Admin
、Home
和 Gallery
。在这 4 个控制器中,我只需要授权 Admin
个控制器,其余控制器可以匿名访问。因此,我用 [AllowAnonymous]
属性装饰了我的家庭控制器、画廊控制器和帐户控制器,并且我用名为 [CustAuthFilter]
的自定义授权过滤器装饰了我的 Admin
控制器,它包含以下代码。
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/home
或 domainname/gallery
时,它都会自动重定向到 domainname/account/login
。但是我不知道为什么即使在用 [AllowAnonymous]
装饰了家庭和画廊控制器之后它还是重定向到帐户控制器!!
该行为是由于授权配置而发生的,即
<authorization>
<deny users="?"/>
</authorization>
从您的配置中删除这一行,之后它应该可以正常工作。
您正在尝试混合使用 Web.config 中的授权和 MVC 中可用的授权属性。阅读此 link 以明确回答不使用授权标签 Authorize attribute vs authorization node in web.config
我有 4 个控制器,即 Account
、Admin
、Home
和 Gallery
。在这 4 个控制器中,我只需要授权 Admin
个控制器,其余控制器可以匿名访问。因此,我用 [AllowAnonymous]
属性装饰了我的家庭控制器、画廊控制器和帐户控制器,并且我用名为 [CustAuthFilter]
的自定义授权过滤器装饰了我的 Admin
控制器,它包含以下代码。
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/home
或 domainname/gallery
时,它都会自动重定向到 domainname/account/login
。但是我不知道为什么即使在用 [AllowAnonymous]
装饰了家庭和画廊控制器之后它还是重定向到帐户控制器!!
该行为是由于授权配置而发生的,即
<authorization>
<deny users="?"/>
</authorization>
从您的配置中删除这一行,之后它应该可以正常工作。
您正在尝试混合使用 Web.config 中的授权和 MVC 中可用的授权属性。阅读此 link 以明确回答不使用授权标签 Authorize attribute vs authorization node in web.config