Windows サービスでホストされている WCF サービスがあります。アプリケーションはイントラネット アプリであり、サービスとクライアントの両方で次のようにバインディングをプログラムで設定しました。
NetTcpBinding aBinding = new NetTcpBinding(SecurityMode.Transport);
aBinding.Security.Transport.ClientCredentialType = TcpClientCredentialType.Windows;
aBinding.Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.EncryptAndSign;
サービスとクライアントの両方に、SPN で構成されたエンドポイントがあります。
EndpointAddress = new EndpointAddress(uri, EndpointIdentity.CreateSpnIdentity("Service1"));
私が知る限り、バインディングは正しくセットアップされており、通常は問題なくサービスに接続できます。ただし、Windows Server 2003 R2、x64、SP2 を実行しているサーバーで、クライアントが接続を試みるとすぐに次の例外が発生するケースに遭遇しました。
INNEREXCEPTION -- 例外メッセージ:
InvalidCredentialException: ターゲット名が正しくないか、サーバーがクライアント資格情報を拒否しました。
スタックトレース:
at System.Net.Security.NegoState.ProcessAuthentication(LazyAsyncResult lazyResult)
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)
ドメイン内の別のマシンからサービスに接続しようとすると例外が発生しますが、サービスを実行している同じマシンでサービスに接続すると正常に動作します。
ホスティング サービス自体はドメイン ユーザー アカウントとして実行されていますが、サービスをローカル システムおよびネットワーク サービスとして実行しようとしましたが、うまくいきませんでした。サーバーのローカル セキュリティ ポリシーを確認しましたが、問題はありませんでした (つまり、[ネットワーク経由でこのコンピューターにアクセス] に [すべてのユーザー] が含まれています)。
誰でもこれを解決できるアイデアを持っていますか?
サービスの SPN に関して、Active Directory で何かを行う必要があるかどうか疑問に思っていますか? setspn.exe を使用して SPN を登録または更新する方法についていくつか読んだことがありますが、これまでこれを行う必要はありませんでした。これが他の構成では機能するのに、上記の構成では機能しないのはなぜですか?