Я был во всем Интернете, пытаясь выяснить, почему мой пользовательский 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?
Спасибо за вашу помощь заранее, это очень ценится!