我提前为这个问题的长度道歉,但我想确保提供完整的信息,因为我已经研究了几个星期。
作为有关WCF授权错误的this问题的后续内容,我正在尝试确定如何为服务指定SPN(或者应该是UPN?)。
我的问题是,当我尝试联系服务时,我会通过负载均衡器。负载均衡器交替将我发送到两个服务器之一svcserv1或svcserv2。我没有在服务代码中指定除负载均衡器域名之外的任何内容,但是当应用程序连接到一台服务器时它很好而另一台服务器总是无法通过身份验证。
打开Kerberos日志记录后,这是来自svcserv1(虚拟服务器)的片段,显示成功。请注意,此成功引用了第二个服务器(svcserv2),它是一个物理服务器。
Logon attempt using explicit credentials:
Logged on user:
User Name: jsweb
Domain: DOMAIN
Logon ID: (0x0,0x6278B2DA)
Logon GUID: {ca6e029d-4073-3f85-5ff5-16514b9acc03}
User whose credentials were used:
Target User Name: jsweb
Target Domain:
Target Logon GUID: -
Target Server Name: svcserv2.domain.com
Target Server Info: svcserv2.domain.com
Caller Process ID: 6680
Source Network Address: -
Source Port: -
与svcserv1通信失败的原因如下:
Logon attempt using explicit credentials:
Logged on user:
User Name: jsweb
Domain: DOMAIN
Logon ID: (0x0,0x6278B2DA)
Logon GUID: {ca6e029d-4073-3f85-5ff5-16514b9acc03}
User whose credentials were used:
Target User Name: jsweb
Target Domain:
Target Logon GUID: -
Target Server Name: svcserv1.domain.com
Target Server Info: svcserv1.domain.com
Caller Process ID: 6680
Source Network Address: -
Source Port: -
Logon Failure:
Reason: An error occurred during logon
User Name: jsweb
Domain:
Logon Type: 3
Logon Process: ˜]
Authentication Package: NTLM
Workstation Name: SVCSERV1
Status code: 0xC000006D
Substatus code: 0x0
Caller User Name: -
Caller Domain: -
Caller Logon ID: -
Caller Process ID: -
Transited Services: -
Source Network Address: 10.1.36.80
Source Port: 56078
“登录失败”响应出现在用户“NT AUTHORITY \ SYSTEM”的事件查看器中,因此我假设这是服务运行的对象。 jsweb
id(上方)在web.config中设置为模拟身份:<identity impersonate="true" userName="DOMAIN\jsweb" password="password"/>
出于这个原因,在我看来它应该生成一个SPN(主机/主机名),但在集群环境的情况下,更有意义的是应该生成UPN(username @ domainName)。对不起,如果我不能在这里更具体。有没有办法让我看到哪些是预期/传播的? This文章指出“如果您将SPN或UPN设置为空字符串,则会发生许多不同的事情,具体取决于所使用的安全级别和身份验证模式。如果您使用传输级别安全性,NT LanMan选择(NTLM)身份验证。“因为我正在使用
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Windows"/>
</security>
而且,显然?,SPN是空白的,然后默认为NTLM。这可以在“验证包”旁边的故障输出中看到
进一步引用MSDN表示“当您使用NT LanMan(NTLM)进行身份验证时,不会检查服务标识,因为在NTLM下,客户端无法对服务器进行身份验证。”所以这解释了这个问题,但我无法确定解决方案。我没有为端点指定<identity>
,但尝试使用群集域名...
<endpoint>
<identity>
<dns value="svcserv"/>
</identity>
</endpoint>
......但这没效果。
我确实发现这篇令人失望的微软知识库文章标题为'Authentication delegation through Kerberos does not work in load-balanced architectures',但我必须相信这是可能的,因为使用负载均衡器并不罕见。 也许我在追逐自己的尾巴,因为在'Setting up Kerberos Authentication against the cluster name Service Principal Name'(特别是第3阶段:客户管理)中,声明“客户端实际上没有特殊的步骤。客户端计算机必须使用SPN在域用户帐户上注册“我是否受服务器管理团队的支配?
感谢您提供任何帮助,并随时要求澄清。