У меня следующий сценарий (все приложения и службы используют asp. net core 3.0 на Windows):
У меня есть клиентское приложение, которое выполняется в контексте AppUser , Он использует HttpClient для отправки запроса в WebServiceA, который работает в контексте WebUser. В запросе используется аутентификация Windows.
var credentialsCache = new CredentialCache { { uri, "Negotiate", CredentialCache.DefaultNetworkCredentials } };
var handler = new HttpClientHandler { Credentials = credentialsCache };
var httpClient = new HttpClient(handler);
В WebServiceA вызов принят правильно и аутентифицирован: HttpContext.User.Identity.IsAuthenticated
- истина, HttpContext.User.Identity.Name
- AppUser.
Для возможности чтобы обработать запрос, WebServiceA должен отправить еще один запрос в WebServiceB. Этот запрос также должен быть аутентифицирован как AppUser .
В настоящее время я использую следующий код для создания HttpClient, который выполняет запрос к WebServiceB:
var credentialsCache = new CredentialCache { { uri, "Negotiate", CredentialCache.DefaultNetworkCredentials } };
HttpClientHandler handler = new HttpClientHandler
{
Credentials = credentialsCache,
UseDefaultCredentials = true
};
HttpClient httpClient = new HttpClient(handler);
проблема в том, что вызов всегда аутентифицируется как WebUser (который запускает службу), а НЕ AppUser (который отправил запрос) .
Я думал, что DefaultNetworkCredentials всегда принадлежат аутентифицированному пользователю.
Как я могу отправить (из WebRequest) другой WebRequest на другой WebService, который аутентифицирован тем же пользователем, который отправил исходный запрос? Есть ли способ передать аутентификацию от одного WebService к другому?
Относительно Kerberos и AD: WebServiceA и WebServiceB работают на разных серверах в одном домене. Они размещены не в IIS, а в Windows Service.
Я попытался установить имя участника-службы, как описано здесь: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-3.0&tabs=visual-studio
setspn -S HTTP/ServerA.domain domain\WebUser
Также пробовал: setspn -a WebServiceA/WebUser domain\WebUser
Но безуспешно.
После трех дней веб-исследований и попыток, у меня кружится голова ... Как я могу получить UserCredentials во второй запрос? Или из-за (возможно, неправильной?) Конфигурации AD (SPN) WebService всегда молча принимает учетные данные пользователя, запустившего службу?
Я благодарен за каждую подсказку!
Штеффи