APSX ページの応答から NTLM 資格情報を取得します。
-
03-07-2019 - |
質問
NTLM 資格情報を使用して呼び出される ASPX ページ (サーバー A 上) があります。そのページのジョブの一部は、HTML ページ (サーバー B 上) を呼び出し、それをクライアントにプロキシして返すことです。(ファイアウォールは A へのアクセスを許可しますが、B へのアクセスは許可しません。通常、ユーザーは両方のサーバーへのアクセスを許可されます)。サーバー B も匿名アクセスに対してオープンではないため、サーバー B に資格情報を提供する必要があります。
一部の資格情報を (添付のコードに従って) ハードコーディングすると機能しますが、理想的には、.aspx ページで受信した資格情報をエコーします。これらの NetworkCredentials を取得して渡す方法はありますか?
protected void Page_Load(object sender, EventArgs e) {
Response.Clear();
WebClient proxyFile = new WebClient();
CredentialCache cc = new CredentialCache();
cc.Add(new Uri("http://serverB/"), "NTLM",
new NetworkCredential("userName", "password", "domain"));
proxyFile.Credentials = cc;
Stream proxyStream = proxyFile.OpenRead("http://serverB/Content/webPage.html");
int i;
do {
i = proxyStream.ReadByte();
if (i != -1) {
Response.OutputStream.WriteByte((byte)i);
}
} while (i != -1);
Response.End();
}
解決
確かに発信者のログイン名は取得できますが、パスワードは取得できません。NTLM はチャレンジ/レスポンス メカニズムを使用するため、パスワードが送信されることはありません。チャレンジを作成して応答を確認するには、サーバーはパスワード相当物 (ハッシュ) にアクセスする必要がありますが、たとえそれを入手できたとしても、そのパスワード相当物は、次のような資格情報を形成しようとする場合には役に立ちません。サーバー B によって受け入れられます。
別の回答で説明されているように、偽装を設定できる場合でも、必ずしも希望どおりの結果が得られるわけではありません。デフォルトでは、偽装サーバー プロセスがその ID を別のサーバーに送信することは許可されていません。この 2 番目のホップは委任として知られており、関係するサーバー (および/または Active Directory) で明示的に構成する必要があります。
委任とは別に、唯一の選択肢は、サーバー A がアクセスしてサーバー B に提示できる資格情報のデータベースを維持することだと思います。これを安全な方法で構築するのは、複雑で時間のかかるプロセスです。一方、委任がデフォルトで無効になっているのには理由があります。サーバーにログインするときに、他のサーバーにアクセスするために自分の ID を使用できるようにしたいですか?委任は最も簡単なオプションですが、サーバー A が侵害されてユーザーの ID に対して無責任な行為が行われないようにする必要があります。
他のヒント
Page.User は、ページを実行しているユーザーのセキュリティ プリンシパルを取得します。
そこから、それを理解できるはずです。
あなたのシナリオでは、発信者の身元を偽ることはできますか?そうすれば、資格情報を渡す必要さえなくなります。例:
<authentication mode="Windows" />
<identity impersonate="true" />
サーバーAのweb.config内。ただし、サーバー A ではそれを望まない場合もあるため、これは状況によって異なります。ただし、可能であれば、カスタム コードを使用せずに問題を解決できる可能性があります。
偽装を設定するためのリンクは次のとおりです。 http://msdn.microsoft.com/en-us/library/ms998351.aspx#paght000023_impersonatingorigcaller