Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
服务器使用用户帐户的WCF Kerberos客户端的模式_Wcf_Deployment_Wcf Security_Kerberos - Fatal编程技术网

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

服务器使用用户帐户的WCF Kerberos客户端的模式,wcf,deployment,wcf-security,kerberos,Wcf,Deployment,Wcf Security,Kerberos,我们有一个WCF(Windows Communication Foundation)客户端和服务应用程序。我们正在对Kerberos使用Windows身份验证 问题是该服务可能在多个帐户中的一个帐户下运行(可能是网络服务,可能是特定的用户帐户--取决于IT组)。该账户不太可能每天都发生变化,但可能会偶尔(可能每隔几个月)发生变化。此外,我们将此客户机/服务包交付给多个组,每个组可能都有自己的帐户,用于运行服务(这只是为了让您知道,我们不能为单个团队提供自定义解决方案) 现在,上述段落之所以成为问

我们有一个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,如
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