2

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

问题是该服务可能在许多帐户之一下运行(可能是网络服务,也可能是特定用户帐户——取决于 IT 组)。此帐户不可能每天更改,但可能偶尔更改(可能每隔几个月)。此外,我们将此客户端/服务包提供给多个组,每个组可能有自己的帐户用于运行服务(这只是为了让您知道我们不能为单个团队提供自定义解决方案)。

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

有关此限制的更多信息,请参阅: http ://social.msdn.microsoft.com/Forums/en-US/wcf/thread/feb6bc31-9a4b-4f8d-a887-ef6d2c7abe41 和http://www.vistax64.com/indigo /146204-using-localhost-vs-environment-machinename.html

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

诚然,这很像端点移动的 URI。除了,我认为人们对更改 URI 是客户端必须知道的事情有更多的期望,但是更改运行服务的帐户对客户端来说应该是相对透明的。

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

4

2 回答 2

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 的奇妙世界以及它们如何破坏您的一天,您可以阅读服务发布和服务主体名称的工作原理

更新

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

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

您还可以使用 Setspn.exe 工具向域中的服务帐户注册其他 SPN。然后,您可以使用 SPN 作为服务的标识。要下载该工具,请参阅 Windows 2000 资源工具包工具:Setspn.exe。有关该工具的更多信息,请参阅 Setspn 概述。

于 2009-07-19T02:12:24.760 回答
2

设置NegotiateServiceCredentialEstablishSecurityContext属性为False

于 2010-02-03T20:11:51.820 回答