Вызов веб-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 для доступа к нему.

Другие вопросы по тегам