を取得し、私は次のようなアーキテクチャがあります。私は私のサーバー側のアプリケーション/ APIのASP.NETを使用していますが、ユーザーが一体化窓」を介して認証されなければならないWindows認証偽装 - 2番目のリクエストが間違ったユーザアイデンティティ
Client1(Browser-App) -> Server1 (WebAPI/IIS) -> Server2 (WebAPI/IIS)
を認証 "と呼ばれる。
ご覧のとおり、server1からserver2までの2番目のホップがあります。両方のWebAPIが同じサーバー上にない場合、NTMLは第2ホップをサポートしません。 私は "kerberos"をサポートするようにADドメインを設定しました。
これは現在2番目のホップで動作します。 私のテストWebAPIs出力このようなユーザのアイデンティティ:
server1: test.domain/user1
server2: test.domain/user1
しかし、私はクライアント1にログイン中のユーザーを変更し、「otherUser2」と同じ要求を実行した場合、最初のホップが正しいIDを取得します:
server1: test.domain/otherUser2
server2: test.domain/user1
第2ホップでは、最初の要求の古いユーザーが表示されます。 複数のシナリオをテストしました:次の要求が別のWindowsユーザーと別のクライアントから来た場合、同じ動作...
最初の要求のWindows IDがサーバー2にキャッシュされているようです...これは大きな問題です私にとってはこれが可能ではないはずです...リクエストが間違ったユーザコンテキストで実行された場合、大きなセキュリティホールです!
これは既知の問題ですか?私は間違ったことをしましたか? 解決策またはより良い設定がありますか?私は.NETのWebClientクラスを使用
WindowsIdentity identity = (WindowsIdentity)HttpContext.Current.User.Identity;
using (var wic = identity.Impersonate())
{
try
{
WebClient c = new WebClient
{
UseDefaultCredentials = true
};
- :私はこのような偽装を使用する最初のASP.NETのWebAPIの上
。
- 両方のIISサーバーには、「ネゴシエーション」と「NTML」が構成された「Windows認証」があります。
- Server1はDomainController、DNSおよびDHCP-Server(+ IIS)です
- Server2はIISがインストールされている通常のサーバーです。
- すべてのコンピュータは同じドメインにあります。
私にこの現象を説明することはできません...私には意味がありません。なぜ最初の着信リクエストのIDを 'server2'にキャッシュする必要がありますか? IISを再起動して別のWindows IDで要求を再実行すると、これが「最初の作業要求」であり、他のユーザーは「server2」でIDを取得します。
info:サーバーは「Windows server 2012 R2」で、IISにはバージョン8があります – user437899
は、user1の下で実行されているIIS AppPoolですか? –
委任権限と割り当てられたSPNを持つ "偽装"ユーザーで実行されている – user437899