2013-10-25 1 views
6

У меня возникли некоторые проблемы с моим обычаем AuthorizeAttributeПользовательское AuthorizeAttributte с Enum Роль PARAMS получать нулевые значения в Ajax вызова

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 типизированных роли, поэтому я использую перечисления.

+0

Как вы проходя роли пользователя? – Satpal

+0

Ну, я использую его как пользовательский атрибут поверх моего контроллера, как я использую AuthorizeAttribute [Авторизовать (Roles = «Admin, SuperAdmin»)], и он проверяет, но я хотел бы использовать его следующим образом: [ExplicitAuthorize [ (MembershipUserRole.Admin, MembershipUserRole.SuperAdmin)] – nramirez

ответ

5

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

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

Итак, что вы сделали, это украсить действие ASP.NET Web API с помощью AuthorizeAttribute, о котором он ничего не знает.

Если вы хотите, чтобы авторизация в 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 ...   
    } 
} 
+0

Приятно! = D Спасибо. Он работает отлично. – nramirez

Смежные вопросы