2016-09-02 1 views
0

Сценарийпроверка подлинности Windows Web API Несанкционированное - Несколько серверов

У меня есть два приложения, работающие на разных серверах, в пределах одной и той же внутренней сети.

Сервер 1 содержит проект WebAPI MVC.

Сервер 2 содержит веб-приложение MVC, которая вызывает API на сервере 1.

Оба приложения работают с использованием проверки подлинности Windows.

Код отлично работает, когда я запускаю их локально, как через IIS, так и через Visual Studio.

При работе на сервере я получаю следующее сообщение об ошибке:

The remote server returned an error: (401) Unauthorized.

Ниже приводится запрос от скрипача.

GET http://server1/..../..../GetTest HTTP/1.1 
Host: server 1 
Connection: keep-alive 
Cache-Control: max-age=0 
Authorization: Negotiate YIIHIgYGKwYBBQUCoIIHFjCCBxK..... 
Upgrade-Insecure-Requests: 1 
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36 
Accept:  text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 
Accept-Encoding: gzip, deflate, sdch 
Accept-Language: en-GB,en-US;q=0.8,en;q=0.6 
Cookie: ASP.NET_SessionId=gffyzdgub41op0diygy5lyv2 

Ниже АНИ код запроса

public string GetTest() 
{ 

    string sURL = "http://server2/.../api/test?value=JERONIMO"; 
    WebRequest wrGETURL = WebRequest.Create(sURL); 

    wrGETURL.Credentials = CredentialCache.DefaultCredentials; 
    var result = ""; 
    using (Stream objStream = wrGETURL.GetResponse().GetResponseStream()) { 
     using(StreamReader objReader = new StreamReader(objStream)) { 

      string sLine = ""; 
      int i = 0; 

      while (sLine != null) { 
       i++; 
       sLine = objReader.ReadLine(); 
       if (sLine != null) result += sLine; 
      } 
     } 
    } 

    return result; 
} 

Спасибо за помощь.

ответ

0

Это хорошо известная проблема при использовании Windows Authentication под названием double hop.

2 решения такой задачи:

  • Изменить Application pool identity на Server2 от ApplicationPoolIdentity к учетной записи службы, чтобы нам разрешили делать звонки Server1. Это решение не распространяет контекст как пользовательский вызов api на Server2 (вы все равно можете это сделать, отправив параметризованную информацию в ваши методы Server1, чтобы делать вызовы для фильтрации данных).

  • Внесите constrained delegation, чтобы разрешить Server2 переслать идентификатор пользователя на Server1; если у вас нет сильных требований безопасности для этого, я бы взял первый подход.

+0

привет, спасибо за информацию. Я немного запутался в решении 1. Почему мне нужно изменить ApplicationPoolIdentity в моем проекте WebAPI? Разве это не должно быть веб-приложение MVC, которое работает под учетной записью службы, которой доверяет WebAPI? Также я нашел эту ссылку о отключении loopbackcheckhttps: //blogs.technet.microsoft.com/sharepoint_foxhole/2010/06/21/disableloopbackcheck-lets-do-it-the-right-way/ - Является ли loopback таким же, как doublehop? И есть ли проблема с его отключением? Еще раз спасибо – SkelDave

+0

ApplicationPoolIdentity не является учетной записью службы с точки зрения Active Directory, поэтому, когда она выходит наружу, она не проходит проверку подлинности, и поэтому вы получаете 401. – bsoulier

+0

Что я имел в виду: если приложение MVC будет запускаться под учетной записью Active Directory , и API под ApplicationPoolIdentity? Или оба работают под учетными записями? Благодарю. – SkelDave

Смежные вопросы