2012-03-16 21 views
0

ユーザーは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モジュールを使用していますか?

ありがとうございます!

答えて

0

私はこの問題を解決するために多くを無駄にしましたが、直接的な解決策はありません。 これは、win authがiisサイトレベルでは動作しないため、現在のリクエストを認証する方法を制御できないためです。 ipに応じて、異なるログインページでリダイレクトを使用するいくつかの方法があります。

+1

。あなたのご意見ありがとうございます。 –

0

私はこれが古い投稿であることを知っていますが、私はこの問題の解決方法を共有したいと思います。 (読み:非ローカルホスト)リモート要求に対する応答メッセージを変更するとき

:あなたはレスポンスが「通過」することができない場合

<system.webServer> 
    <httpErrors existingResponse="PassThrough"></httpErrors> 
</system.webServer> 

あなたの設定ファイルに以下を追加する必要があります。リモートクライアントはデフォルトの"You do not have permission to view this directory or page"を取得します。

私はからこの情報を得た:それはハックとサポートされていないようですので、私たちは、これを回避するために、最後にログインシステムを再設計https://stackoverflow.com/a/17324195/3310441

関連する問題