Пользовательский MVC AuthorizeAttribute для веб-API ASP.NET
Я пытаюсь реализовать собственный атрибут авторизации на своих контроллерах веб-API, но столкнулся с неожиданным поведением.
<Authorize(Users:="myUser")>
Public Function GetTodoItems() As IQueryable(Of TodoItem)
Вышеприведенный код работает очень хорошо: он позволит "myUser" извлекать элементы, бот никому другому не разрешен доступ. Однако, когда я пытаюсь использовать тот же подход с моей пользовательской авторизацией, вся проверка пропускается, и любой пользователь может получить доступ к ресурсу. Не вызываются AuthorizeCore
и OnAuthorization
переопределенные методы в моем производном классе.
<MyAuth(Users:="myUser")>
Public Function GetTodoItems() As IQueryable(Of TodoItem)
Производный класс наследует от System.Web.Mvc.AuthorizeAttribute
, а проект развертывается в IIS, с включенной аутентификацией Windows и олицетворением, а анонимная аутентификация отключена.
Если я добавлю одну и ту же настраиваемую авторизацию к контроллеру MVC, то она будет работать. Но на контроллерах API ничего. Если бы атрибут Authorize
не работал бы, это имело бы смысл. Я что-то упускаю? Является ли это ожидаемым поведением или ошибкой в бета-версии?
Ответы
Ответ 1
Вы должны использовать System.Web.Http.AuthorizeAttribute
из System.Web.Http.dll для Web API вместо System.Web.Mvc.AuthorizeAttribute
.
То есть, поскольку namespace System.Web.Http.AuthorizeAttribute
получен из AuthorizationFilterAttribute
. Фильтры обрабатываются автоматически веб-API. В моей собственной реализации я получил непосредственно из AuthorizationFilterAttribute
для обработки базовой HTTP-аутентификации.
Ответ 2
Я создал собственную собственную реализацию для базовой авторизации:
http://remy.supertext.ch/2012/04/basic-http-authorization-for-web-api-in-mvc-4-beta/
Возможно, это помогает.