我有一个机器控制应用程序,我有一台客户端计算机和五个服务器盒在机器子网上进行通信。没有域控制器。我想使用netTcpBinding来提供可靠性和事务支持。
当域控制器不存在时,是否可以对此绑定使用用户名/密码验证?我不想使用证书,因为我不想在900台计算机(150台机器)上管理不能连接到办公室局域网的证书。
答案 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>