Пользовательский 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-аутентификации.