Запрос на двойной переход ASP в сценарии делегирования Kerberos

Пожалуйста помоги! Мне нужно мое приложение asp для запроса удаленных систем с учетными данными олицетворенного пользователя. Но всегда получаю 401 несанкционированную ошибку. Я сделал все настройки отсюда: https://stackoverflow.com/questions/10308938/unable-to-authenticate-to-asp-net-web-api-service-with-httpclient Kerberos настроен и работает в моем приложении и моем протестировать удаленное приложение (я вижу билеты Kerberos в скрипте). Делегирование, spns и все настроено.

Это мой код usnig System.Net.Http.httpclient:

    HttpClientHandler handler = new HttpClientHandler()
{
    UseDefaultCredentials = true,
    PreAuthenticate = true
};

using (HttpClient client = new HttpClient(handler))
{
    client.DefaultRequestHeaders.Accept.Clear();
    var method = new HttpMethod("GET");
    var request = new HttpRequestMessage(method, "http://testdelegationapp.avp.ru/");
    var response = client.SendAsync(request).Result;
}

Фактически http-запрос выполняется учетной записью Apppool (я получаю ошибку 401 при ограничении доступа к учетной записи Apppool в удаленном приложении IIS)

Здесь: Как заставить HttpClient передавать учетные данные вместе с запросом? утверждается, что HttpClient не может передать токен безопасности другому потоку, и лучше использовать синхронные методы System.Net.WebClient

Код с использованием веб-клиента:

var wi = (WindowsIdentity)HttpContext.User.Identity;
var wic = wi.Impersonate();
try
{
    string URI = "http://testdelegationapp.avp.ru/";
    using (WebClient wc = new WebClient())
    {
        wc.UseDefaultCredentials = true;
        string response = wc.DownloadString(URI);
    }
}
finally
{
    wic.Undo();
}

Результат еще хуже, та же ошибка 401, но в скрипачке я вижу, что веб-клиент использует билет NTLM для доступа к удаленному приложению!

Настройка потоковых токенов вызывает потоки отсюда: Невозможно для аутентификации в службе ASP.NET Web Api с HttpClient тоже не помогает. SecurityContext.IsWindowsIdentityFlowSuppressed () имеет значение false.

WindowsIdentity.GetCurrent (). Name и Thread.CurrentPrincipal.Identity.Name показывает олицетворенного пользователя, как и должно быть.


person Gunman7840    schedule 21.09.2017    source источник


Ответы (1)


Все это время проблема была в браузере chrome, по умолчанию он прохобит делегирование Kerberos. Вы должны добавить в реестр следующее:

Path: HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome ; 
string: AuthNegotiateDelegateWhitelist ; 
value: *.avp.ru

Итак, теперь моя рабочая конфигурация

HttpClient для веб-запросов.

Включено олицетворение ASP в IIS, если вы хотите выполнять все свои приложения с делегированными учетными данными. Если вам нужно делегирование конкретного метода, используйте:

var wi = (WindowsIdentity)HttpContext.User.Identity;    
var wic = wi.Impersonate();
wic.Undo();

HttpClient выполняет запрос в другом потоке, поэтому в aspnet_config.config нам потребуются следующие изменения:

<legacyImpersonationPolicy enabled="false"/>
<alwaysFlowImpersonationPolicy enabled="true"/>

Вы можете найти aspnet_config.config в:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\aspnet.config
C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet.config
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\aspnet.config
C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet.config
person Gunman7840    schedule 24.11.2017
comment
Какая клиентская ОС использовалась в этом сценарии? - person T-Heron; 25.11.2017
comment
@ T-Heron Windows 10 - person Gunman7840; 29.11.2017