服务器使用用户帐户的WCF Kerberos客户端的模式

时间:2009-07-19 01:13:18

标签: wcf deployment wcf-security kerberos

我们有一个WCF(Windows Communication Foundation)客户端和服务应用程序。我们正在使用带有Kerberos的Windows身份验证。

问题是该服务可能在许多帐户中运行(可能是网络服务,可能是特定的用户帐户 - 取决于IT组)。这个帐户不太可能每天都有变化,但可能会在每个月都有变化(可能每隔几个月)。此外,我们将此客户端/服务包提供给多个组,每个组可能拥有自己用于运行服务的帐户(这只是让您知道我们无法为单个团队执行自定义解决方案)。

现在上述段落出现问题的原因显然是如果服务没有在SYSTEM或NETWORK SERVICE帐户中运行,即用户帐户,那么客户端必须在其身份中指定用户帐户的名称端点。

有关此限制的详情,请参阅:http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/feb6bc31-9a4b-4f8d-a887-ef6d2c7abe41http://www.vistax64.com/indigo/146204-using-localhost-v-s-environment-machinename.html

现在这似乎很难处理IT部门更改服务运行的帐户的情况。如果有的话,处理这个的模式是什么?别人怎么处理这个?我想到的一个解决方案是,当服务的用户帐户发生更改时,管理员会发送一封电子邮件,其中包含指向更新客户端或配置文件的应用程序的网络链接,因此客户端引用新的用户帐户。但这似乎是黑客。

不可否认,这很像移动端点的URI。除此之外,我认为代表人们有更多期望,更改URI是客户端应该知道的事情,但更改运行服务的帐户应该对客户端相对透明。

顺便说一下,如果重要的话,这需要在IIS 7.0上托管。

2 个答案:

答案 0 :(得分:8)

我认为您可以将NegotiateServiceCredential属性设置为True,这样您的绑定就会使用SPNego而非硬寒Kerberos。当设置为true时,客户端不需要指定SPN,它可以连接到运行非计算机帐户的服务器。

请注意,由于客户端不再请求特定的SPN,因此无法再检测是否连接到服务的被劫持模仿者,但这通常是一个小问题,除非您对安全性非常偏执。

此外,作为一个侧面咆哮:WCF请求作为SPN的事实,帐户名称基本上是一个脑屁。它应该使用DsMakeSpn API从服务名称,主机和端口组成SPN。服务器应该在启动时为其指定SPN,或者让管理员使用setspn.exe执行此操作。这是Kerberos / ActiveDirecotry / Windows环境中所有传统(表现良好)服务的方式。

<强>更新

第二个虽然我没有看到任何指定客户端必须使用帐户名称作为SPN的内容。看起来更像是文档疏忽,而不是记录他们刚刚推荐的正确方法,这基本上是一种不好的做法。或者只是论坛建议很糟糕,因为我没有深入研究MSDN绑定规范实际上对SPN使用的内容......

我没有方便测试的WCF环境,但也许你可以配置客户端请求正确的SPN,如YourService/server:port,你也可以在服务器端注册相同的SPN。手动将其作为练习留给管理员,或者在启动时自动从您的服务中取出,并在关闭时取消注册。 正确这样做的方法是让管理员这样做,但实际上这是一种痛苦,大多数服务自己注册SPN,你也可以遵循这种做法。要注册SPN,您的服务会拨打DsWriteAccountSpn。写入必须传播到AD并在AD服务器之间进行复制,这至少有一个原因使服务自动注册/自动注销SPN是一个值得怀疑的做法。

如果您想了解更多关于SPN奇迹世界的信息以及它们如何破坏您的一天,您可以阅读How Service Publication and Service Principal Names Work

<强>更新

我很确定你可以使用你喜欢的任何SPN。大多数exmaples使用帐户名称作为“UPN”(用户主体名称)而不是SPN,但这只是为了方便样本,因为使用真正的SPN会遇到在用户帐户下设置SPN的管理问题(再次,为什么管理员应该这样做...)。来自Overriding the Identity of a Service for Authentication,相关强调:

  

默认情况下,当服务是   配置为使用Windows   凭证,一种元素   包含<userPrincipalName>或   <servicePrincipalName>元素是   在WSDL中生成。如果服务   在LocalSystem下运行,   LocalService或NetworkService   帐户,服务主体名称   (SPN)默认生成   host/<hostname>的形式,因为那些   帐户可以访问计算机   SPN数据。如果服务正在运行   在不同的帐户下,Windows   传播基金会(WCF)   生成一个UPN形式的UPN   <username>@<domainName>。这发生了   因为Kerberos身份验证   要求提供UPN或SPN   到客户端进行身份验证   服务。

     

您还可以使用Setspn.exe工具   注册一个额外的SPN与   服务在域中的帐户。您可以   然后使用SPN作为身份   服务。要下载该工具,请参阅   Windows 2000资源工具包工具:   SETSPN.EXE。有关的更多信息   该工具,请参阅Setspn概述。

答案 1 :(得分:2)

NegotiateServiceCredentialEstablishSecurityContext属性设置为False