如果客户端和服务在同一服务器上的同一帐户下运行,是否可以避免指定servicePrincipalName?

时间:2012-06-23 08:58:47

标签: .net wcf exception-handling wcf-security net.tcp

我有一个使用net.tcp绑定配置的WCF服务:

<netTcpBinding>
    <binding >
        <security mode="Transport">
            <transport clientCredentialType="Windows" />
            <message clientCredentialType="None" />
        </security>
    </binding>
</netTcpBinding>

我有一个客户端 - Web应用程序。两者都在同一服务器上的NT AUTHORITY \ NETWORK SERVICE下运行,只是不同的端口。

当客户端尝试连接到服务时,会产生错误:

  

System.ComponentModel.Win32Exception:登录尝试失败

可以修复此问题,在客户端指定servicePrincipalName:

<endpoint>
    <identity>
        <servicePrincipalName value="NT AUTHORITY\NETWORK SERVICE" />
    </identity>
</endpoint>

但我可以避免吗?我希望客户端使用其当前用户。

1 个答案:

答案 0 :(得分:4)

客户端配置的servicePrincipalName值int endpoint / identity部分不指定客户端的标识,而是指定预期的服务标识。请记住,WCF身份验证是相互的(客户端也标识服务)

在这种情况下,客户希望该服务在“网络服务”帐户下运行。

<endpoint>
    <identity>
        <servicePrincipalName value="NT AUTHORITY\NETWORK SERVICE" />
    </identity>
</endpoint>

如果客户端和服务位于同一台计算机上,则可以将其替换为

<endpoint>
    <identity>
        <servicePrincipalName value="host/localhost" />
    </identity>
</endpoint>

服务身份验证现在取决于dns名称(localhost)