Windows資格情報なしのnetTcpBinding?
-
11-07-2019 - |
質問
1台のクライアントコンピューターと5台のサーバーボックスがマシンサブネット上で通信するマシン制御アプリケーションがあります。ドメインコントローラーはありません。 netTcpBinding を使用したい信頼性とトランザクションのサポートを可能にします。
ドメインコントローラーが存在しない場合、このバインディングでユーザー名/パスワード認証を使用できますか?オフィスのLANに接続されない900台のコンピューター(150台のコンピューター)で証明書を管理したくないので、証明書を使用したくないと思います。
解決
はい、もちろん-ただし、(トランスポートセキュリティではなく)メッセージセキュリティを使用する場合のみ。次のようにバインディング構成を定義します。
<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>
「ローカルマシン」にサーバーの証明書をインストールしてください。サーバー上の「サブジェクト名」の下のフォルダー設定で指定すること。
他のヒント
最初に試すことができるものがあります。 serviceNegotiationCredentialsをtrueに設定します。
<message negotiateServiceCredential="true"/>
これにより、ドメインコントローラーなしでクライアントとサービスの間に安全な会話が作成されます。
ただし、ドメインコントローラーがない場合、クライアントはサービスを信頼しないため、失敗します。
したがって、予想されるサービスのID を設定する必要があります。あなたのサービスのWSDLでそれを見つけることができます。デフォルトでは、IISでホストされている場合、次のようになります。
<client>
<endpoint>
<identity>
<servicePrincipalName value="host/NETWORKSERVICE"></servicePrincipalName>
</identity>
</endpoint>
</client>
必要になるとは思いませんが、サービス側で匿名ログオンを許可する必要があるかもしれません:
<serviceBehaviors>
<behavior>
<serviceCredentials>
<windowsAuthentication allowAnonymousLogons="true"/>
</serviceCredentials>
</behavior>
</serviceBehaviors>