Как передать учетные данные 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 Несанкционированную ошибку.