我们有在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”。