我有一个属性来检查控制器操作中的身份验证。我的属性是这样的:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class AuthenticationRequiredAttribute : ActionFilterAttribute, IAuthenticationFilter
{
private readonly bool checkAuthentication;
public AuthenticationRequiredAttribute(bool checkAuthentication)
{
this.checkAuthentication = checkAuthentication;
}
public void OnAuthentication(AuthenticationContext filterContext)
{
if (checkAuthentication && !UserIdentity.IsAuthenticated)
filterContext.Result = new HttpUnauthorizedResult();
}
public void OnAuthenticationChallenge(AuthenticationChallengeContext filterContext)
{
if (filterContext.Result == null || filterContext.Result is HttpUnauthorizedResult)
{
filterContext.Result = new RedirectToRouteResult(
new System.Web.Routing.RouteValueDictionary{
{"controller", "Account"},
{"action", "Login"}
});
}
}
}
如果checkAuthentication = false
没有检查身份验证。
除一个操作外,控制器中的所有操作都应检查身份验证。我在控制器上应用[AuthenticationRequired(true)]
,在具体操作上应用[AuthenticationRequired(false)]
。但它不起作用,总是检查身份验证。
将[AuthenticationRequired(true)]
应用于其他操作并将其从控制器中删除时,它可以正常工作。
在这种情况下如何强制使用方法属性?
答案 0 :(得分:2)
修改您的OnAuthentication
并添加AllowAnonymous
属性的验证。
bool skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true)
|| filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), inherit: true);
if (skipAuthorization)
{
return;
}
之后,只需将AllowAnonymous
属性添加到应跳过authentication \ authorization的方法。
答案 1 :(得分:1)
如果您应用控制器级别过滤器,则它适用于所有操作并覆盖任何同名过滤器。
您可以将过滤器应用于每个操作,也可以尝试使用已接受的答案here。这将允许您指定要排除的操作。