DotNet Core HttpSys Windows身份验证-双跳问题

时间:2019-03-28 08:58:55

标签: reporting-services .net-core azure-service-fabric service-fabric-on-premises httpsys

我们有在Service Fabric平台上开发的微服务,这些微服务部署在独立的本地群集上。我们有一个网站,该网站配置为使用Windows身份验证,然后模拟已登录的用户以获取SSRS报告。我们已经使用HttpSys构建了Web主机。从应用程序框本身以外的任何服务器访问网站时,我们都面临着双跳问题。

无状态服务的代码如下所示:

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;
    });
}

我们已经尝试了一切。正确创建了所有SPN。我们已经有一个古老的Silverlight网站,该网站可以正常运行,并且可以在Windows身份验证的相同基础上工作,并且可以冒充用户以获取SSRS报告。

只是为了验证服务结构如何创建服务是否存在问题,我使用HttpSys自托管服务器创建了独立的DotNet核心网站。还是同样的问题。

我试图在网上查找,但没有文档或其他遇到类似问题的人。

  

HTTP请求未经客户端身份验证方案授权   'Ntlm'。从服务器收到的身份验证标头是“ NTLM”。

0 个答案:

没有答案