9

我创建了一个具有 wsHttpBinding 和消息安全性的 WCF 服务。然后我添加了一个服务引用,导致客户端的配置文件被更新为:

<client>
  <endpoint address="http://localhost:42160/Service1.svc/secure"
    binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_IService1"
    contract="SecureProxy.IService1" name="WSHttpBinding_IService1">
    <identity>
        <userPrincipalName value="baria2@mydomain.com" />
    </identity>
  </endpoint>
</client>

我不明白 userPrincipalName 的用途。无论我将值修改为什么,客户端和服务都能成功通信。它似乎没有任何目的。

这篇MSDN 文章试图详细解释其目的,但不知何故根本没有解释任何内容。

微软试图通过将其添加到 WCF 故事中来解决什么问题?同样,我可以将值更改为我想要的任何值,并且不会影响客户端和服务。

另外,这是一个类似的问题

4

3 回答 3

1

通常,upn 用于向客户端验证服务器(例如,您指示客户端哪个服务器受信任,哪个不信任,例如客户端验证 ssl 中的主机)。

我认为如果 upn 具有正确的值,那么通信将使用 kerberos,如果它是错误的,那么通信将使用 ntlm(如果在某些条件下可用)。尝试禁用 ntlm,然后只有正确的 upn 值才会起作用:

<clientCredentials>
   <windows allowNtlm="false" />
</clientCredentials>

还有一种方法可以通过在服务器上放置断点/日志并检查 ServiceSecurityContext.Current 来检查是否使用了 kerberos 或 ntlm。您应该根据 upn 值获得不同的值。

于 2013-07-25T22:12:35.887 回答
-1

默认情况下,当服务配置为使用 Windows 凭据时,会生成一个<identity>and<userPrincipalName>元素。

于 2013-07-25T03:05:12.483 回答
-1

默认情况下,当服务配置为使用 Windows 凭据时,会在由服务模型元数据实用工具 (Svcutil.exe) 生成的 WSDL 文档中生成一个 and 元素。如果服务在 LocalSystem 下运行。LocalService 或 NetworkService 帐户,服务主体名称 (SPN) 将以 host/ 的形式生成,因为这些帐户可以访问计算机的 SPN 数据。如果服务在不同的帐户下运行,WCF 会生成 @ 形式的主体名称 (UPN)。这是因为 Kerberos 身份验证需要向客户端提供 UPN 或 SPN 以对服务进行身份验证。

如果您在代码或配置中设置服务端点的标识,则不会发生此行为。您还可以使用 SetSpn.exe ( http://www.microsoft.com/windows2000/techinfo/reskit/tools/existing/setspn-o.asp ) 工具在域中使用服务帐户注册其他 SPN。然后可以将 SPN 用作服务的标识。

如此处所述:https ://social.msdn.microsoft.com/Forums/vstudio/en-US/78638457-ca7a-4f88-b8a9-9bc32d4b5c7d/userprincipalname-element-generated-in-client-config?forum=wcf

于 2017-07-06T18:42:16.923 回答