Я по всему интернету пытался выяснить, почему мой пользовательский авторизованный атрибут не работает в моем MVC WebApi. Я видел, как люди спрашивают о такого рода вещи на SO, но ничего не помогло мне решить мою проблему еще:Пользовательский авторизованный атрибут, не вызываемый MVC Framework
[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?
Спасибо за вашу помощь заранее, это очень ценится!
Основываясь на моих комментариях о том, как я применил специальный атрибут авторизации ... Для начала я думаю, что вы хотите переопределить OnAuthorization, а не AuthorizeCore. Кроме того, я не уверен, что вам нужно, чтобы ваш класс был запечатан. –