サーバー B で WCF サービス (K2 ワークフロー) を呼び出す Web アプリをサーバー A で実行しており、呼び出し元のユーザーとして実行するために偽装/委任が必要です。サーバー A から Web アプリを実行すると、アプリはうまく機能します。デバッグでローカル PC からアプリを実行すると、うまく機能します。PC のブラウザーからサーバー A にアプリをヒットすると、次のエラーが表示されます。
HTTP 要求は、クライアント認証方式 'Ntlm' では許可されていません。サーバーから受信した認証ヘッダーは「Ntlm,Negotiate」でした。System.Net.WebException: リモート サーバーがエラーを返しました: (401) 権限がありません。System.Net.HttpWebRequest.GetResponse() で System.ServiceModel.Channels.HttpChannelFactory`1.HttpRequestChannel.HttpChannelRequest.WaitForReply (TimeSpan タイムアウト) で。
次のコードを使用してサービスを実行します。
SvcWorklist.ClientCredentials.Windows.AllowedImpersonationLevel = System.Security.Principal.TokenImpersonationLevel.Delegation;
SvcWorklist.ClientCredentials.Windows.ClientCredential = System.Net.CredentialCache.DefaultNetworkCredentials;
私はすべてをやったような気がします。ここに私が試したことのリストがあります:
- サーバーAアプリプールドメインユーザーによるサーバーBへのSPN(ポートを含む)のセットアップ(NETBIOSおよびFQDN)
- サーバー A とサーバー B でアプリ プール ユーザーと同じドメイン ユーザーを設定します。
- アプリケーション プール ユーザーが Active Directory で委任できることを確認します
- 両方のサーバーが AD で委任できるようにする
- サーバー A の web.config で認証を windows に設定し、impersonate=true に設定します。
- Thread.CurrentPrincipal.Identity.Name に自分のユーザー ID があることを確認
- IIS が Windows と偽装用に設定されていることを確認
- サーバーAおよびBのIIS構成をNtlmおよび/またはネゴシエートのみに制限しようとしました
どんな助けやアイデアも本当に感謝しています。