Как я могу использовать аутентификацию Windows с Microsoft.Rest.ServiceClient
У меня есть Microsoft.Rest.ServiceClient
генерируется с autorest
, И я хочу получить доступ к REST API, защищенному с помощью Windows Authentication и Basic Authentication.
Цель состоит в том, чтобы использовать проверку подлинности Windows. Я попробовал это следующим образом:
var handler = new HttpClientHandler
{
UseDefaultCredentials = true,
};
this.InitializeHttpClient(handler);
Это не работает, я получаю:
System.Net.Http.HttpRequestException: An error occurred while sending the request.
---> System.Net.WebException: The remote server returned an error: (401) Unauthorized.
---> System.ComponentModel.Win32Exception: The target principal name is incorrect
Когда я использую обычную аутентификацию, она работает.
this.Credentials = new BasicAuthenticationCredentials
{
UserName = Configuration.User,
Password = Configuration.Password
};
Эта настройка ServiceClient
делается в конструкторе
MyClient : Microsoft.Rest.ServiceClient
Что мне нужно добавить к клиенту, чтобы работала аутентификация Windows?
Отредактировано:
Похоже, проблема на стороне сервера. Настройки в IIS.
Клиент будет работать как положено.
2 ответа
Это в основном повторяет то, что уже описано в OP и @Anders, в моем предпочтительном синтаксисе...
var windowsAuthHandler = new HttpClientHandler { UseDefaultCredentials = true };
var webApiUri = new System.Uri("https://localhost:8080");
var apiClient = new MyAutoRestClient(webApiUri ,windowsAuthHandler);
Если вы скиммируете, OP, кажется, указывает, что это не работает, хотя на самом деле это работает. Но, как позже утверждает OP, обязательно начните с IIS, чтобы убедиться, что он настроен правильно
Я использую аналогичное решение для передачи учетных данных Windows, и оно прекрасно работает. Разница лишь в том, что я использую перегрузку конструктора ServiceClient
это занимает HttpClientHandler
экземпляр, а не вызов InitializeHttpClient()
и это выглядит примерно так:
public class MyClient : ServiceClient<MyClient>
{
public MyClient() : base(new HttpClientHandler { UseDefaultCredentials = true }) {}
}
Однако часть вашего 401-сообщения, в которой указано "Целевое имя участника неверно", выглядит подозрительно. Ваша проблема может возникнуть из-за некоторых проблем в вашей AD-конфигурации, а не в ServiceClient
-конфигурации.
@bkwdesign имеет право
var credentials = new Microsoft.Rest.BasicAuthenticationCredentials();
var handler = new System.Net.Http.HttpClientHandler() { UseDefaultCredentials = true };
var uri = new Uri("http://your-rest-api:8008");
var svc = new WebApplication1Client(uri, credentials, handler);
//WebApplication1Client : ServiceClient<WebApplication1Client>, IWebApplication1Client
Это способ передачи учетных данных из MVC в проверку подлинности Windows WebAPI или олицетворение учетных данных.
Возможно другие варианты:
var handler = new HttpClientHandler() { Credentials = CredentialCache.DefaultCredentials };
var handler = new HttpClientHandler() { Credentials = CredentialCache.DefaultNetworkCredentials };