私のチームにはかなり大きなアプリケーションがあり、WCFNetTCPベースのサービスを多数含むアプリケーションを開発しています。このシステムが実行されるWindowsサービスは、ローカルアカウントではなく、標準のドメインユーザー(サービスをホストするサーバーの管理者権限を持つ)になります。接続のテスト中に、SSPI呼び出しが失敗するという問題が発生しました。数時間の調査に基づいて、これにより、クライアント構成から次の行が欠落しているという道をたどりました。
<identity>
<userPrincipalName value="MACHINE\user" />
</identity>
これを使用する際の問題は、VSまたはsvcutilを使用してこのサービスのクライアント/プロキシを生成しないことです。使用されているプロキシは完全にコードで記述されており、System.ServiceModel.ClientBaseを継承します。このオプションが選択された元々の理由は、フェンスの両側のサービスを通過するまったく同じDataMemberオブジェクトを使用できるようにするためだったと思います。サードパーティのグループはサービスに接続する必要がないため、これは問題ではありませんでした。 。
標準のsystem.serviceModel構成セクションでエンドポイントが指定されていない場合に、クライアントでuserPrincipalNameを(コードまたは構成を介して)設定する方法を知っている人はいますか?
参考までに、クライアント側のweb.configは次のようになります。
<system.serviceModel>
<diagnostics>
<messageLogging logEntireMessage="true" logMalformedMessages="true"
logMessagesAtServiceLevel="true" logMessagesAtTransportLevel="true" />
</diagnostics>
<behaviors>
<serviceBehaviors>
<behavior name="includeExceptions">
<serviceDebug includeExceptionDetailInFaults="true"/>
<dataContractSerializer maxItemsInObjectGraph="2147483647"/>
</behavior>
</serviceBehaviors>
</behaviors>
<bindings>
<netTcpBinding>
<binding name="NetTcpBinding_Default" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="Infinite" sendTimeout="01:00:00" portSharingEnabled="true" transferMode="Buffered" maxReceivedMessageSize="2147483647">
<readerQuotas maxDepth="2147483647" maxStringContentLength="2147483647" maxArrayLength="2147483647" maxBytesPerRead="2147483647" maxNameTableCharCount="2147483647" />
<security mode="Transport">
<transport clientCredentialType="Windows" protectionLevel="EncryptAndSign"/>
</security>
</binding>
</netTcpBinding>
</bindings>
</system.serviceModel>