Пользовательский атрибут AuthorizeAttribute, не вызываемый MVC Framework

Я был во всем Интернете, пытаясь выяснить, почему мой пользовательский AuthorizeAttribute не работает в моем MVC WebApi. Я видел, как люди спрашивали об этом на SO, но пока ничего не помогло мне решить мою проблему:

 [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, 
                 Inherited = false)]
    public sealed class CustomAuthorization : AuthorizeAttribute
    {

        //...

         protected override bool AuthorizeCore(HttpContextBase httpContext)
        { 
           // custom auth logic, returns true if authorized, false otherwise
        }
    }

Я расширяюсь от System.Web.Mvc, а не от System.Web.Http. Однако мой AuthorizeCore(HttpContextBase httpContext) никогда не вызывается.

У меня есть конструктор в моем классе CustomAuthorization, который принимает params string[], которые являются именами моих пользовательских разрешений, необходимых для определенного действия, например:

[CustomAuthorization("Some Permission")]
[System.Web.Http.HttpGet]
public CustomResponse SomeAction()
{
   //...
}

Чего я надеюсь добиться, так это запускать мой код авторизации всякий раз, когда делается запрос к действию, украшенному атрибутом [CustomAuthorization]. Я также хочу иметь возможность возвращать более описательное сообщение об ошибке аутентификации, если авторизация не удалась. Не просто:

{"Message":"Authorization has been denied for this request."} 

Я считаю, что это связано с переопределением HandleUnauthorizedRequest, но как я могу это сделать, чтобы предоставить свой собственный объект, который будет сериализован ответом JSON?

Подводя итог, мой код авторизации никогда не вызывается фреймворком, даже если я украшаю действия своим атрибутом [CustomAuthorization]. Он просто переходит непосредственно к выполнению кода внутри действия.

Во-вторых, как я могу реализовать несанкционированные ответы для сериализации пользовательского объекта JSON?

Спасибо за вашу помощь заранее, это очень ценится!


person Darius    schedule 20.03.2013    source источник
comment
Основываясь на моих комментариях о том, как я реализовал настраиваемый атрибут авторизации... Для начала, я думаю, вы хотите переопределить OnAuthorization, а не AuthorizeCore. Кроме того, я не уверен, что вам нужно запечатать свой класс.   -  person Cloud SME    schedule 20.03.2013


Ответы (1)


Хорошо, я в конце концов решил это, и вот как:

public override void OnAuthorization(HttpActionContext actionContext) {

    ....

    if (!authorized) {

       actionContext.Response =    
                  actionContext.Request.CreateResponse(
                                   HttpStatusCode.Unauthorized, 
                                   new  Dictionary<string, string> { 
                                                { "hello", "world" } 
                                   }
                  );

    }

}

Что дает результат:

{"hello":"world"}

Объект Dictionary является произвольным, он просто демонстрирует, что тип будет успешно сериализован в Response.

Если вы не установите actionContext.Response, запрос продолжится до целевого действия, т.е. он считается авторизованным этим фильтром.

Надеюсь, что это поможет другим в этом положении.

person Darius    schedule 20.03.2013
comment
Было облегчением найти такое простое решение! Спасибо за ваши усилия, очень признателен. Рад, что теперь все работает! - person Darius; 21.03.2013