DotNet Core HttpSys Windows Аутентификация - проблема двойного прыжка - PullRequest
0 голосов
/ 28 марта 2019

У нас есть 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'.

...