5

我的自定义 AuthorizeAttribute 有问题

public class ExplicitAuthorizeAttribute : AuthorizeAttribute
{
    private readonly MembershipUserRole[] _acceptedRoles;

    public ExplicitAuthorizeAttribute()
    {

    }

    public ExplicitAuthorizeAttribute(params MembershipUserRole[] acceptedRoles)
    {
        _acceptedRoles = acceptedRoles;
    }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {  
       //Validation ...          
    }
}

我这样使用它:

[ExplicitAuthorize[(MembershipUserRole.Admin, MembershipUserRole.SuperAdmin)]

它非常适合 HttpGet 和 HttpPost 验证我的控制器和方法。

但是当我在 ApiController 中使用它并进行 ajax 调用时,AuthorizeCore 没有运行,我遇到了安全漏洞。:/

我的枚举看起来像这样

[Flags]
public enum MembershipUserRole
{
    Admin= 1,
    SuperAdmin = 2
}

有谁知道为什么我的 AuthorizeCore 在这种情况下没有验证?

顺便说一句,如果我使用

[Authorized(Roles ="Admin, SuperAdmin")]

它验证得很好,但我想拥有 Stronly Typed Roles,这就是我使用枚举的原因。

4

1 回答 1

5

您从错误的类派生:System.Web.Mvc.AuthorizeAttribute而对于 Web API 控制器,您应该从System.Web.Http.AuthorizeAttribute.

不要忘记 ASP.NET MVC 和 ASP.NET Web API 是 2 个完全不同的框架,即使它们共享一些共同的原理和名称,相应的类位于 2 个完全不同的命名空间中。

因此,您所做的是使用它不知道的 AuthorizeAttribute 来装饰 ASP.NET Web API 操作。

如果您想在 ASP.NET Web API 中进行授权,请确保您从正确的属性派生:

public class ExplicitAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    private readonly MembershipUserRole[] _acceptedRoles;

    public ExplicitAuthorizeAttribute()
    {

    }

    public ExplicitAuthorizeAttribute(params MembershipUserRole[] acceptedRoles)
    {
        _acceptedRoles = acceptedRoles;
    }

    protected override bool IsAuthorized(HttpActionContext actionContext)
    {
        //Validation ...          
    }
}
于 2013-10-25T17:24:32.590 回答