SSPI:用户主体名称 WCF 客户端

Posted

技术标签:

【中文标题】SSPI:用户主体名称 WCF 客户端【英文标题】:SSPI: user principle name WCF client 【发布时间】:2012-12-23 13:25:30 【问题描述】:

我正在尝试访问 wcf 客户端。我知道人们现在正在从中获取信息,所以我知道它有效。我的问题是我似乎无法克服它。该服务是相互认证的服务。我在本地计算机上的个人商店中有适当的证书。即使这样,我也会遇到以下异常:

 A call to SSPI failed, see inner exception

深入搜索异常,我看到了:

Message : The target principal name is incorrect

我该如何解决这个问题?我是否需要模拟运行应用程序池的用户?我是否需要添加 Identity\ServicePrincipleName 或 Identity\UserPrincipleName?有没有人遇到过类似的问题?

【问题讨论】:

【参考方案1】:

为了供其他人将来参考,我遇到了这个问题,但现有的答案没有帮助。

我的问题是 userPrincipalName 被用作服务参考。

我最近重新注册了服务参考以便更新它,但它用我的电子邮件地址覆盖了日志文件中指定的userPrincipalName

<endpoint address="net.pipe://localhost/XXXX"
  binding="netNamedPipeBinding" bindingConfiguration="NetNamedPipeBinding_IXXX"
  contract="XXXServiceReference.IXXX"
  name="NetNamedPipeBinding_IXXXX">
  <identity>
    <userPrincipalName value="my@emailaddress.com" />
  </identity>
</endpoint>

为了解决这个问题,我只是将userPrincipalName 更改为localhost,它是以前的:

<userPrincipalName value="localhost" />

【讨论】:

【参考方案2】:

对我来说,当我在端点中指定服务器的用户名时,它就起作用了。不是客户的用户名。它是 UPN,而不是 SPN。

new EndpointAddress(
    new Uri("net.tcp://server:1234/MyWcf/svc"),
        EndpointIdentity.CreateUpnIdentity("username@domain.local"))

据我了解,客户端验证它正在与预期用户交谈。

【讨论】:

【参考方案3】:

我重新生成了客户端,并且 output.config 文件中的端点现在有了<identity> <userPrincipalName value="Serviecname@companyname.com" /> </identity> 在端点标签中。所以新的端点看起来像 -

 <endpoint address="net.tcp://machinename:6001/ReferenceDataService" binding="netTcpBinding" bindingConfiguration="netTcpBindingConf" contract="IReferenceDataService" >
     <identity>
 <userPrincipalName value="Serviecname@companyname.com" />

这解决了我的问题

【讨论】:

如果有人不熟悉 WCF - 我使用 svcutil.exe 重新生成客户端,并使用它生成 output.config。【参考方案4】:

在此处查看我对类似问题的回答:netTCP binding Soap Security Negotiation Failed。本指南应适用于其他绑定,而不仅仅是 TCP。

【讨论】:

以上是关于SSPI:用户主体名称 WCF 客户端的主要内容,如果未能解决你的问题,请参考以下文章

WCF 服务 - 身份验证/SSPI 错误

除非客户端和服务器使用相同的 Windows 身份,否则带有 sspi 的 WCF Net.tcp 会失败

WCF“对 SSPI 的调用失败,请参阅内部异常”

具有外部信任的 WCF SSPI 失败 - 选择性与域范围

如何防止“请求主体权限失败”导致 WCF 客户端出错?

客户端-服务器身份验证 - 使用 SSPI?