没有Windows凭据的netTcpBinding?

时间:2009-08-03 15:26:11

标签: wcf credentials nettcpbinding

我有一个机器控制应用程序,我有一台客户端计算机和五个服务器盒在机器子网上进行通信。没有域控制器。我想使用netTcpBinding来提供可靠性和事务支持。

当域控制器不存在时,是否可以对此绑定使用用户名/密码验证?我不想使用证书,因为我不想在900台计算机(150台机器)上管理不能连接到办公室局域网的证书。

2 个答案:

答案 0 :(得分:11)

是的,当然 - 但前提是您使用Message安全性(而不是传输安全性)。像这样定义绑定配置:

  <netTcpBinding>
    <binding name="UserNameSecurity">
      <security mode="Message">
        <message clientCredentialType="UserName"/>
      </security>
    </binding>
  </netTcpBinding>

然后在端点中引用该绑定配置(在服务器和客户端上):

 <endpoint address="....."
           binding="netTcpBinding"
           bindingConfiguration="UserNameSecurity"
           contract="IMyService" />

马克

更新:
啊,是的,在服务器端,你需要一个证书来证明服务给客户端调用它,它还用于加密+签名消息。这只是在服务器上 - 客户端不需要安装任何东西。

配置:

<behaviors>
  <serviceBehavior>
    <behavior name="ServerInternet">
      <serviceCredentials>
        <serviceCertificate
           findValue="MyServiceCertificate"
           storeLocation="LocalMachine"
           storeName="My"
           x509FindType="FindBySubjectName" />
      </serviceCredentials>
    </behavior>
  </serviceBehavior>
</behaviors>
<services>
  <service name="MyServiceInternet"
           behaviorConfiguration="ServerInternet">
     ....
  </service>
</services>

确保将服务器的证书安装到服务器上的“本地计算机”文件夹中,在配置中指定的“主题名称”下。

答案 1 :(得分:0)

你可以先尝试一下。将serviceNegotiationCredentials设置为true:

<message negotiateServiceCredential="true"/>

这将在没有域控制器的情况下在客户端和服务之间创建安全对话。

但是,如果没有任何域控制器,则客户端不信任您的服务,因此它将失败。

所以你应该设置预期的identity of the service。您可以在服务的WSDL中找到它。默认情况下,如果您托管在IIS上,它似乎是:

<client>
    <endpoint>
        <identity>
            <servicePrincipalName value="host/NETWORKSERVICE"></servicePrincipalName>
        </identity>
    </endpoint>
</client>

我认为你不需要它,但也许你必须允许匿名登录服务端:

<serviceBehaviors>
    <behavior>
        <serviceCredentials>
            <windowsAuthentication allowAnonymousLogons="true"/>
        </serviceCredentials>
    </behavior>
</serviceBehaviors>