ランタイム偽装を機能させるのに苦労しています。
シナリオ:
- すべてのサーバーで匿名アクセスが無効になっており、Windows 認証が有効になっています
- クライアントが Web API 1 を呼び出す
- Web Api 1 は Web Api 2 または oData サービスを呼び出すことができます
- Web Api 1 から Web Api 2 への呼び出しは、クライアント資格情報で偽装する必要があります
- Web Api 1 から oData Service への呼び出しは偽装してはなりません
- Web Api 1 は、Web リクエストを使用して両方のサービスを呼び出します
- Kerberos 委任が適切に構成されている
何が機能するか(ちょっと):
Web.config を使用して Web Api 1 で偽装を有効にすると、
<authentication mode="Windows"/>
<identity impersonate="true"/>
- すべての通話が偽装されています。Web Api 1 --> Web Api 2、および Web Api 1 --> oData サービス
これは私たちが望んでいるものではありません。アプリケーション プール アカウントを介してのみ oData サービスにアクセスできるようにします。したがって、Web Api 1 からのすべての発信呼び出しを偽装したくありません。
プログラムによるなりすまし
次のコードを使用して、Web Api 1 から Web Api 2 への呼び出しのみを偽装しようとしました。
Web.config で偽装を無効にする
<authentication mode="Windows"/>
<identity impersonate="false"/>
Web Api 1 から Web Api 2 への呼び出しを偽装します。
// Impersonate the currently authenticated User
using (((WindowsIdentity)HttpContext.Current.User.Identity).Impersonate()) {
var request = (HttpWebRequest)HttpWebRequest.Create(uri);
...
...
request.Credentials = CredentialCache.DefaultCredentials;
response = (HttpWebResponse)request.GetResponse();
};
結果:
- Web Api 1 から oData への呼び出しは偽装されません (予想どおり)
- Web API 1 から Web API 2 への呼び出しも偽装されません。これが問題です。
質問:
- これは Web サービスで実行時の偽装を実装する方法ですか?
- 私たちは何を間違っていますか?
どんなポインタも役に立ちます。