Пользовательский AuthorizeAttributte с параметрами Enum Roles, получающими нулевые значения при вызове ajax

У меня возникли проблемы с моим пользовательским атрибутом 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")]

Он отлично проверяется, но я хотел бы иметь строго типизированные роли, поэтому я использую перечисления.


person nramirez    schedule 25.10.2013    source источник
comment
Как вы передаете роли пользователей?   -  person Satpal    schedule 25.10.2013
comment
Ну, я использую его как пользовательский атрибут поверх моего контроллера, например, я использую AuthorizeAttribute [Authorize(Roles=Admin,SuperAdmin)] и он проверяет, но я хотел бы использовать его вот так [ExplicitAuthorize[(MembershipUserRole.Admin,MembershipUserRole .СуперАдмин)]   -  person nramirez    schedule 25.10.2013


Ответы (1)


Вы произошли от неправильного класса: System.Web.Mvc.AuthorizeAttribute, тогда как для контроллера веб-API вы должны получить от System.Web.Http.AuthorizeAttribute.

Не забывайте, что ASP.NET MVC и ASP.NET Web API — это 2 совершенно разных фреймворка, и даже если они имеют общие принципы и имена, соответствующие классы находятся в 2 совершенно разных пространствах имен.

Итак, что вы сделали, так это украсили действие веб-API ASP.NET атрибутом AuthorizeAttribute, о котором оно ничего не знает.

Если вы хотите выполнить авторизацию в веб-API ASP.NET, убедитесь, что вы получили правильный атрибут:

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 ...          
    }
}
person Darin Dimitrov    schedule 25.10.2013