在类和方法中同时应用属性时,如何强制使用方法属性?

时间:2016-03-30 13:29:04

标签: c# asp.net-mvc custom-attributes actionfilterattribute

我有一个属性来检查控制器操作中的身份验证。我的属性是这样的:

[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)]应用于其他操作并将其从控制器中删除时,它可以正常工作。

在这种情况下如何强制使用方法属性?

2 个答案:

答案 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。这将允许您指定要排除的操作。