Сгенерировал прокси к WCF-сервису. WCF-сервис требует аутентификации пользователем Active Directory.
Из консольного приложения запрос проходит нормально, безо всяких ухищрений.
Копирую код в приложение ASP.NET Core, получаю:
CommunicationException: Authentication failed because the connection could not be reused.
Оба приложения .NET Core 2.2.
Запускаю Fiddler, веб-приложения работает нормально — три запроса, Negotiate, в третьем запросе получаю нужный ответ.
Как починить, чтобы без Fiddler работало?
так консольное приложение выполняется из под контекста конкретного пользователя, а веб-приложение исполняется, скорее всего, из под контекста ApplicationPoolIdentity, который , наверное, никаким местом к AD не привязан
вообще, странное сочетание, но если очень хочется, то можно либо сменить application pool/ApplicationPoolIdentity на какого-то конкретного пользователя, либо использовать Impersonation, и опять же вызов производить из контекста этого самого существующего AD пользователя
посмотри, как в WCF tracing конфигурируется, чуть побольше деталей увидишь того, что там не так
T>так консольное приложение выполняется из под контекста конкретного пользователя, а веб-приложение исполняется, скорее всего, из под контекста ApplicationPoolIdentity, который , наверное, никаким местом к AD не привязан
Да не в этом дело. Веб-приложение работает под моими доменными кредами и в БД ходит с ними. Я ж пишу, что если запустить Fiddler, то запросы к WCF работают. Я знаю, что Fiddler подставляет свой сертификат для TLS, но не знаю, что мне делать с этим знанием.
T>посмотри, как в WCF tracing конфигурируется, чуть побольше деталей увидишь того, что там не так
Да, понять бы, как трассировка WCF конфигурируется в .Net Core...
// Invoke a service operation asynchronously with impersonation. static async void Demo() {
using (CalculatorClient client = new CalculatorClient())
{ // Enable the server to impersonate.
client.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Impersonation;
// Open the client before the first asynchronous request.
client.Open();
// Invoke the Add operation asynchronously and display the result. double result = await client.AddAsync(1.0, 2.0);
Console.WriteLine("Add returned {0}", result);
client.Close();
}
}
wireshark-ом можешь ещё ,наверное, трафик посмотреть
SocketsHttpHandler is the default implementation in .NET Core 2.1. However, you can configure your application to use the older HttpClientHandler class by calling the AppContext.SetSwitch method:
C#
You can also use an environment variable to opt out of using sockets implementations based on SocketsHttpHandler. To do this, set the DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER to either false or 0.
Будем держать пальцы крестиком. На научные изыскания больше времени нет. Спасибо коллеге takTak за неравнодушие.