2

ランタイム偽装を機能させるのに苦労しています。

シナリオ:

  • すべてのサーバーで匿名アクセスが無効になっており、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 サービスで実行時の偽装を実装する方法ですか?
  • 私たちは何を間違っていますか?

どんなポインタも役に立ちます。

4

1 に答える 1