У меня есть веб-приложение MVC, использующее аутентификацию и авторизацию модели идентификации, которая работает очень хорошо. Это же веб-приложение также поддерживает веб-API REST. До сих пор все вызовы API работали неавторизованно (по замыслу).
Теперь у меня есть необходимость поддерживать аутентифицированные вызовы API, но я не могу отделить поведение при сбое аутентификации Web API от поведения на веб-сайте. Веб-API не подходит для перенаправления на страницу входа в случае сбоя аутентификации, вместо этого он должен возвращать вызывающему HTTP-ответ 401.
Контроллеры для веб-страниц используют AuthorizeAttribute на маршрутах, которые должны быть авторизованы, и если не авторизованный пользователь пытается получить к ним доступ, они перенаправляются на страницу входа.
Я реализовал собственный IAuthenticationFilter, чтобы я мог пометить вызовы API с помощью атрибута HmacAuthenticationAttribute. (Я почти уверен, что конкретный механизм аутентификации здесь не имеет значения.) При использовании в автономном прототипе web-api он работает отлично, и ответом на запрос клиента является правильный код Http 401 в случае сбоя аутентификации.
Когда точно такой же фильтр добавляется в веб-интерфейс в моем реальном веб-приложении, ошибка аутентификации приводит к перенаправлению на страницу входа в систему, и клиент получает ответ Http 200 OK со страницей входа html в теле ответа. Это явно НЕ желаемое поведение.
Может ли кто-нибудь дать представление о том, как отделить веб-страницу от ответов веб-API при использовании фильтров атрибутов аутентификации?
Если нет, мне нужно будет выполнить рефакторинг, чтобы не использовать атрибут, и вместо этого вызвать мою аутентификацию в качестве метода, но не похоже, что это необходимо.