サーバー上でWindowsサービスとしてホストされているnet.tcpバインディングを持つWCFサービスがあります。このサービスにアクセスできません。しかし、ローカルネットワークでホストしている場合は、それを行うことができました。
メッセージ:**サーバーはクライアントの資格情報を拒否しました。
内部例外:
System.Security.Authentication.InvalidCredentialException:
The server has rejected the client credentials.
---> System.ComponentModel.Win32Exception:
The logon attempt failed --- End of inner exception stack trace
--- at System.Net.Security.NegoState.ProcessAuthentication(LazyAsyncResult lazyResult)
at System.Net.Security.NegotiateStream.AuthenticateAsClient(NetworkCredential credential, ChannelBinding binding, String targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
at System.Net.Security.NegotiateStream.AuthenticateAsClient(NetworkCredential credential, String targetName, ProtectionLevel requiredProtectionLevel, TokenImpersonationLevel allowedImpersonationLevel)
at System.ServiceModel.Channels.WindowsStreamSecurityUpgradeProvider.WindowsStreamSecurityUpgradeInitiator.OnInitiateUpgrade(Stream stream, SecurityMessageProperty& remoteSecurity)
解決策を探してみましたが、私の要件に合うものが見つからなかったため、ここに投稿しました。
何が問題でしょうか?
クライアントでセキュリティモードを[なし]にした場合
<security mode="None"></security>
別のエラーが発生します:
エラー:ソケット接続が中止されました。これは、メッセージの処理エラー、リモートホストによる受信タイムアウトの超過、または根本的なネットワークリソースの問題が原因である可能性があります。ローカルソケットのタイムアウトは「00:00:59.5149722」でした。
[〜#〜] dmz [〜#〜] でサーバーを取得しようとして同じ問題が発生し、ネットワーク内のサービスと通信しています。私のためにそれを修正した解決策は、app.configに以下を追加することでした:
セキュリティノードに注意してください。
<bindings>
<netTcpBinding>
<binding name="customTcpBinding" maxReceivedMessageSize="20480000" transferMode="Streamed" >
<security mode="None"></security>
</binding>
</netTcpBinding>
</bindings>
エラーはTokenImpersonationエラーです。
発生しているように見えるのは、呼び出しが着信することです。サーバー側の一部のコードでは、ユーザーがサーバーコードに偽装されている必要があります。
サーバーコードはローカルシステムアカウントとして実行されているため、ドメインユーザーを偽装することはできません。
2つの基本的なオプションがあります。
これについては、「セキュリティをオフにする」で既に回答済みです。しかし、誰かが興味を持っている場合は、イントラネット環境でNetTcpBindingを使用してWCFトランスポートWindows認証を取得できたので、かなり苦労しました。
基本的には、次の構成を使用することになります。
<security mode="Transport">
<transport clientCredentialType="Windows" />
</security>
ブログの投稿イントラネット環境でのNetTcpBindingを使用したWCFトランスポートWindows認証で、もう少し詳細を確認できます。
私たちのものは、ローカルイントラネット内のWCFサービスに接続するWindowsベースのアプリケーションです。セキュリティレベルはWindows認証に設定されています。このエラーが時々発生しました。調査の結果、Windowsパスワードの有効期限が切れていることがわかりました。パスワードを変更すると、すべて正常に機能しました...
このエラーが時々発生するかどうかは簡単なチェックです。
「ソケット接続が中止されました」という2番目のエラーは、通常、サービスから大量のデータを送り出そうとしたときに発生します。
最初に資格情報を機能させるためにユーザーの偽装をお勧めし、次に問題の通知について考えます。
方法:サービスでクライアントを偽装するに偽装に関する有用な情報があります。
@vonbalajiと同様に、何度か間違ってパスワードを入力したためにアカウントがロックアウトされたときにこれを確認しました。