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 的方法。