Как я могу использовать аутентификацию 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 };
Другие вопросы по тегам