DotNet Core HttpSys Windows Аутентификация - проблема двойного прыжка
У нас есть Micro Services, разрабатываемые на платформе Service Fabric, которые развернуты в автономном локальном кластере. У нас есть веб-сайт, который настроен на использование проверки подлинности Windows, а затем вошедший в систему пользователь олицетворяет для получения отчетов SSRS. Мы использовали HttpSys для создания веб-хостинга. И мы сталкиваемся с проблемой двойного прыжка, когда к веб-сайту обращаются с любого сервера, кроме самого приложения.
Код выглядит ниже для службы без сохранения состояния:
protected override IEnumerable<ServiceInstanceListener> CreateServiceInstanceListeners()
{
return new ServiceInstanceListener[]
{
new ServiceInstanceListener(serviceContext =>
new HttpSysCommunicationListener(serviceContext, "ServiceEndpoint", (url, listener) =>
{
return new WebHostBuilder()
.UseHttpSys(
options =>
{
options.Authentication.Schemes = AuthenticationSchemes.Negotiate | AuthenticationSchemes.NTLM;
options.Authentication.AllowAnonymous = false;
}
)
.ConfigureServices(
services => services
.AddSingleton<StatelessServiceContext>(serviceContext))
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseServiceFabricIntegration(listener, ServiceFabricIntegrationOptions.None)
.UseUrls(url)
.Build();
}))
};
}
В Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthenticationCore(options =>
{
options.DefaultScheme = HttpSysDefaults.AuthenticationScheme;
});
}
Вызов SSRS:
if (User.Identity is WindowsIdentity currentUser)
{
WindowsIdentity.RunImpersonated(currentUser.AccessToken, () =>
{
var reportServer = ReportServer();
var trustedUserHeader = new ReportService2010.TrustedUserHeader();
reportServer.ClientCredentials.Windows.AllowedImpersonationLevel = TokenImpersonationLevel.Identification;
var items = reportServer.ListChildrenAsync(trustedUserHeader, ReportFolder, true).Result;
});
}
Мы перепробовали все. Все имена участников-служб созданы правильно. У нас уже есть устаревший веб-сайт Silverlight, который работает нормально и работает на той же основе, что и проверка подлинности Windows, и подменяет пользователя на получение отчетов SSRS.
Просто чтобы проверить, связана ли проблема с тем, как сервисная структура создает сервисы, я создал автономный базовый веб-сайт DotNet, используя собственный сервер HttpSys. Все та же проблема.
Я пытался найти в Интернете, но нет документации или любого другого человека, который сталкивался с подобной проблемой.
HTTP-запрос не авторизован с помощью схемы аутентификации клиента Ntlm. Заголовок аутентификации, полученный от сервера, был "NTLM".