ユーザーはWindows認証を使用して認証できる内部システムがありますが、カスタムのユーザー名/パスワード認証ページにユーザーを誘導する401のrepsonseにカスタムコンテンツを含める必要がありますWindowsの認証ダイアログをキャンセルした場合。認証されていないユーザーがページにアクセスするとASP.NETにカスタムコンテンツを含めるWindows認証401の応答
は、Windows認証では、ヘッダ
WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
これは、Windows資格情報を尋ねるダイアログを表示するようにブラウザに指示して、401権限応答で応答します。ユーザーが資格情報を入力すると、別のハンドシェイク要求 - 応答があり、ユーザーが認証され、要求されたページが表示されます。
ユーザーがダイアログをキャンセルすると、ブラウザーに元の401 Unauthorized応答の内容が表示されます。 Global.asaxでApplication_EndRequestを使用してカスタムのコンテンツを返します。カスタムコンテンツはカスタムログインシステムに戻ります。
/// <summary>
/// If we are about to send the NTLM authenticate headers, include this content. Then, if the user cancels off the
/// windows auth dialog, they will be presented with this page and redirected to the username/password login screen
/// </summary>
void Application_EndRequest(object sender, EventArgs e)
{
Logger.DebugFormat("in Application_EndRequest. Response.StatusCode: {0}", Response.StatusCode);
if (Response.StatusCode == 401)
{
Response.ContentType = "text/html";
var redirectUrl = string.Format("https://mycompany.com/SSO/Login?encryptedSessionRequestId={1}",
HttpUtility.UrlEncode(Request.QueryString["encryptedSessionRequestId"]));
var text = File.ReadAllText(Server.MapPath("~/UnauthorizedError.html"));
text = text.Replace("[USERNAME_PASSWORD_LOGON_REDIRECT]", redirectUrl);
Response.Write(text);
Logger.Debug("Done writing response");
Response.End();
}
}
UnauthorizedError.htmlが、これは素晴らしい作品
<script language="javascript" type="text/javascript">
window.location = "[USERNAME_PASSWORD_LOGON_REDIRECT]";
</script>
(Win7の/ IIS7.5)にローカルで実行上のユーザーを転送し、次のスクリプトが含まれている、我々はにResponse.Writeを()を使用します私たちのコンテンツを送信すると、ユーザーはダイアログをキャンセルするとそれを見ることができます。
しかし、サイトにリモートでアクセスする場合、私たちの開発環境では、Application_EndRequestが呼び出され、その内容がレスポンスに書き込まれていることがログからわかりますが、ある時点でオーバーライドされ、ブラウザに到達するのは認証ヘッダーとテキストです。You do not have permission to view this directory or page.
1)このコンテンツを上書きしないようにするにはどうすればよいですか?
2)パイプラインでは、これが起こっている可能性がありますか?
3)誰もこの動作を実装するための別の方法を提案していますか? HTTPモジュールを使用していますか?
ありがとうございます!
。あなたのご意見ありがとうございます。 –