服务器使用用户帐户的WCF Kerberos客户端的模式
我们有一个WCF(Windows Communication Foundation)客户端和服务应用程序。我们正在对Kerberos使用Windows身份验证 问题是该服务可能在多个帐户中的一个帐户下运行(可能是网络服务,可能是特定的用户帐户--取决于IT组)。该账户不太可能每天都发生变化,但可能会偶尔(可能每隔几个月)发生变化。此外,我们将此客户机/服务包交付给多个组,每个组可能都有自己的帐户,用于运行服务(这只是为了让您知道,我们不能为单个团队提供自定义解决方案) 现在,上述段落之所以成为问题,显然是因为如果服务没有在系统或网络服务帐户(即用户帐户)中运行,那么客户端必须在其端点的标识中指定用户帐户的名称 有关此限制的更多信息,请参阅: 及 现在,这似乎使得it部门更改服务运行的帐户的情况变得很难处理。处理这种情况的模式是什么,如果有的话?其他人是如何处理的?我想到的一个解决方案是,当服务的用户帐户发生更改时,管理员会发送一封电子邮件,其中有一个指向更新客户端或配置文件的应用程序的Web链接,因此客户端会引用新的用户帐户。但这似乎有点老套 诚然,这与端点的URI非常相似。除此之外,我认为人们更期望更改URI是客户端必须知道的事情,但是更改服务运行的帐户对客户端来说应该是相对透明的事情 顺便说一句,如果需要的话,这需要托管在IIS 7.0上。我认为您可以将属性设置为True,以便您的绑定使用而不是硬拷贝。当设置为true时,客户端不需要指定SPN,它可以连接到运行非计算机帐户的服务器 请注意,由于客户端不再请求特定的SPN,因此它无法再检测是否连接到被劫持的服务冒名顶替者,但这通常是一个小问题,除非您真的对安全性抱有疑虑 另外,作为旁白:WCF请求作为SPN的帐户名的事实基本上是大脑放屁。It客户端应该使用API从服务名称、主机和端口组成SPN。服务器应该在启动时为其LEF注册该SPN,或者让管理员使用。这是Kerberos/ActiveDiRecordy/Windows环境中的所有传统(性能良好)服务所采用的方式 更新 在第二个示例中,我没有看到任何内容指定客户端必须使用帐户名作为SPN。看起来更像是一种文档疏忽,而不是以正确的方式记录文档,他们只是推荐了一种基本上不好的做法。或者可能只是论坛的建议是不好的,因为我没有深入研究MSDN绑定规范对要使用的SPN的实际说明 我手头没有WCF环境可供测试,但也许您可以将客户端配置为请求适当的SPN,如服务器使用用户帐户的WCF Kerberos客户端的模式,wcf,deployment,wcf-security,kerberos,Wcf,Deployment,Wcf Security,Kerberos,我们有一个WCF(Windows Communication Foundation)客户端和服务应用程序。我们正在对Kerberos使用Windows身份验证 问题是该服务可能在多个帐户中的一个帐户下运行(可能是网络服务,可能是特定的用户帐户--取决于IT组)。该账户不太可能每天都发生变化,但可能会偶尔(可能每隔几个月)发生变化。此外,我们将此客户机/服务包交付给多个组,每个组可能都有自己的帐户,用于运行服务(这只是为了让您知道,我们不能为单个团队提供自定义解决方案) 现在,上述段落之所以成为问
YourService/server:port
,并且您还可以在服务器端注册相同的SPN。手动将其作为练习留给管理员,或在服务启动时自动从服务中删除,并在关闭时注销。正确的方法是让管理员来做,但实际上这是一件非常痛苦的事情,大多数服务都会自己注册SPN,您也可以遵循这种做法。要注册SPN,您的服务将调用。写入必须传播到AD并在AD服务器之间复制,这至少是让服务自动注册/自动取消注册SPN是一个值得怀疑的做法的一个原因
如果你想了解更多关于SPN的奇妙世界以及它们如何破坏你的一天,你可以阅读
更新
我很确定你可以用任何你喜欢的SPN。大多数Exmaple使用帐户名作为“UPN”(用户主体名)而不是SPN,但这只是为了方便示例,因为使用真正的SPN会遇到在用户帐户下设置SPN的管理问题(同样,为什么管理员应该这样做…)。有关方面强调:
默认情况下,当服务
配置为使用Windows
凭证,一个
包含
或
元素是
在WSDL中生成。如果服务
正在本地系统下运行,
LocalService或NetworkService
帐户,服务主体名称
(SPN)默认情况下在中生成
host/
的形式,因为
帐户可以访问计算机的
SPN数据。如果服务正在运行
在另一个帐户下,Windows
通信基金会(WCF)
以以下形式生成UPN:
@
。这种情况发生了
因为Kerberos身份验证
要求提供UPN或SPN
发送到客户端以验证
服务
您也可以使用Setspn.exe工具
将附加SPN注册到
服务在域中的帐户。你可以
然后使用SPN作为
服务。要下载该工具,请参阅
Windows 2000资源工具包工具:
Setspn.exe。有关
使用该工具时,请参见Setspn概述
将
NegotiateServiceCredential
和EstablishSecurityContext
属性设置为False
谢谢Remus。这看起来不错。我将调查你的链接和方法,看看它们是否能起作用。再次感谢!它似乎确实起作用了!虽然我看到一些奇怪的行为。我所做的是转到AD服务器,运行setspn并将任意spn与用户帐户关联。然后我从服务器和consum中暴露了该SPN