Вызов веб-API из контроллера MVC (проверка подлинности cookie)
У меня есть Web Api и Mvc 5 в одном проекте. Этот веб-интерфейс защищен токеном-носителем (но я прокомментировал строку SuppressDefaultHostAuthentication, поэтому я могу получить доступ к API из браузера, когда я аутентифицируюсь с помощью cookie mvc)
Теперь я пытаюсь получить доступ к API из контроллера MVC без отправки токена, возможно ли это с отключенной SuppressDefaultHostAuthentication?
Пробовал безуспешно (ошибка 401):
HttpClientHandler handler = new HttpClientHandler()
{
PreAuthenticate = true,
UseDefaultCredentials = true
};
using (var client = new HttpClient(handler))
{
client.BaseAddress = new Uri("http://localhost:11374/");
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
var response = client.GetAsync("api/MyApi").Result;
if (response.IsSuccessStatusCode)
{ }
}
Если это невозможно, как лучше всего решить эту проблему?
2 ответа
WebApi придерживается REST, который, помимо прочего, диктует, что запросы не имеют состояния. Это означает, что с WebApi или любым REST-совместимым API нет никакой концепции, такой как файлы cookie, сеансы и т. Д. Каждый запрос к API должен содержать всю информацию, необходимую для обслуживания запроса. Поэтому, если у вас есть конечная точка, которая требует аутентификации, вы должны аутентифицировать запрос для доступа к ней. Период. Если вы выполняете аутентификацию через токены на предъявителя, то вы должны передать токен на предъявителя.
Поскольку WebAPI и приложение MVC находятся в одном проекте, вам не нужно проходить через HTTP и делать запрос для доступа к методу каждого из них - они соседи:)
Вы можете рассматривать WebAPI как обычный класс и создавать его экземпляры в контроллере MVC. После этого вы вызываете методы экземпляра, как и любой другой объект в вашем приложении.
Однако невозможно избежать токенов и / или других механизмов безопасности, с помощью которых разработан WebAPI, если вы используете запрос через HTTP для доступа к нему.