Как передать учетные данные Windows Authentication от клиента к службе веб-API

Внутри моей корпоративной среды у меня есть IIS7.5, на котором размещаются как служба веб-API, так и отдельный веб-сайт, который вызывает звонки в эту службу через библиотеку RestSharp. Оба в настоящее время настроены с помощью проверки подлинности Windows.

Если я перейду к одному из браузеров, мне будет предложено ввести учетные данные для Windows, и все будет отлично... Я получаю нужные веб-страницы, и служба REST вырывает мои данные. Часть, которую я пытаюсь выяснить, заключается в том, как использовать единый учет для аутентификации. Я не могу понять, как либо передать учетные данные веб-сайта службе (я попытался выдавать себя за нее, но это не сработало), либо вручную запросить пользователя для имени пользователя/пароля, а затем выполнить проверку подлинности с помощью "Windows".

Помогите noob?

Ответ 1

Если вы используете олицетворение на своем веб-сайте, и API работает на том же сервере, он должен работать.

http://msdn.microsoft.com/en-us/library/aa292118(v=vs.71).aspx

Однако, если вы переместите API на другой сервер с сайта, это перестанет работать. Для двухсерверной настройки требуется делегирование Kerberos.

Ответ 2

Проведя два дня на этом, я нашел решение.

Настройки веб-API Включите проверку подлинности Windows в веб-интерфейсе API.

Настройки веб-приложения Включите проверку подлинности Windows на веб-приложении. Добавьте <identity impersonate="true" /> system.web в web.config. Добавить

<system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
      </system.webServer>

в web.config

Включить проверку подлинности Windows и олицетворение ASP.NET из IIS.

Пользовательский следующий код для публикации данных в Web API (и аналогично для получения)

using (var client = new WebClient { UseDefaultCredentials = true })
            {
                client.Headers.Add(HttpRequestHeader.ContentType, "application/xml; charset=utf-8");
                byte[] responseArray = client.UploadData("URL of web API", "POST", Encoding.UTF8.GetBytes(XMLText));
                string response = Encoding.ASCII.GetString(responseArray);
            }

ПРИМЕЧАНИЕ. Самое важное - всегда вызывать свой веб-api через IP, если вы используете URL-адрес, вы всегда можете получить 401 Несанкционированную ошибку.