class 中的属性和method 一起应用时,如何强制使用method 属性?
When apply an attribute in class and method together, How to force use method attribute?
我有一个属性来检查控制器操作中的身份验证。我的属性是这样的:
[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)]
应用于其他操作并将其从控制器中删除时,它工作正常。
在这种情况下如何强制使用方法属性?
如果您应用控制器级别过滤器,那么它将应用于所有操作并覆盖任何同名过滤器。
您可以只对每个操作应用过滤器,或者尝试使用已接受的答案 here。这将让您指定要排除的操作。
修改您的 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 的方法。
我有一个属性来检查控制器操作中的身份验证。我的属性是这样的:
[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)]
应用于其他操作并将其从控制器中删除时,它工作正常。
在这种情况下如何强制使用方法属性?
如果您应用控制器级别过滤器,那么它将应用于所有操作并覆盖任何同名过滤器。
您可以只对每个操作应用过滤器,或者尝试使用已接受的答案 here。这将让您指定要排除的操作。
修改您的 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 的方法。