Я работаю над веб-приложением, которое также предоставляет веб-API, и я не вижу такого поведения.
Когда вы используете REST, вам необходим механизм аутентификации пользователя, отправляющего запрос на те конечные точки / ресурсы, которые не являются общедоступными.
Этот механизм может быть либо:
- Отправка ваших учетных данных с каждым запросом. Обычно используется Http Basic Authentication.
- Предоставьте конечной точке аутентификации, которую можно один раз получить с соответствующими учетными данными, и в результате пользователь получит токен / билет, если аутентификация пройдет успешно.
Если вы выбираете второй вариант, то есть альтернативы от простого к сложному, которые сделали бы ваше решение более или менее надежным. Способ Amazon хорошо известен и должным образом задокументирован. Однако иногда достаточно только отправить токен в качестве заголовка с использованием https, если ваши данные не являются , которые чувствительны.
Независимо от того, используете ли вы обычную HTTP-аутентификацию или самый безопасный в мире механизм аутентификации, вам понадобится что-то , которое проверяет то, что вы отправляете при каждом запросе, и заполняет Принципал в контексте запроса .
Это что-то может быть достигнуто в Asp.net Web Api с помощью обработчика сообщений aka DelegatingHandler, который будет обрабатывать каждый запрос к вашим контроллерам API и заполнять ваш Принципал или нет, на основе информации аутентификации, которую он находит.
Вы можете найти пример реализации DelegatingHandler здесь
После того, как вы создадите эту инфраструктуру, вы сможете использовать Syste.Web.Http.AuthorizeAttribute aka [Authorize] на уровне контроллера API или на уровне действий, в соответствии с вашими потребностями. .
Вы должны получить 401 Unauthorized без перенаправления, если DelegatingHandler не может заполнить принципал, учитывая имеющуюся у него информацию об аутентификации.
Не забудьте зарегистрировать ваш DelegatingHandler в App_Start.