WCF客户端指定的“userPrincipalName”用于什么目的?

时间:2013-07-25 02:28:34

标签: wcf wcf-security

我已经使用wsHttpBinding和Message安全性创建了一个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 article试图详细解释目的,并以某种方式设法解释任何事情。

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

此外,还有similar question

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

默认情况下,当服务配置为使用Windows凭据时,将在由服务模型元数据实用工具(Svcutil.exe)生成的WSDL文档中生成和元素。如果服务在LocalSystem下运行。 LocalService或NetworkService帐户,将以host /的形式生成服务主体名称(SPN),因为这些帐户可以访问计算机的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