2012-07-20 14 views
7

IIS6にWindows認証を展開したASP.NET MVC3アプリケーションがあります。認証されたユーザーが、表示する権限のないリンクをクリックすると、期待どおりユーザー名とパスワードを(ページではなくブラウザのダイアログで)入力するよう求められます。401エラーページの代わりに空白ページを取得する

ただし、[キャンセル]をクリックするか、無効な認証情報を3回入力すると、401 Unauthorizedページが表示されるのではなく、空白のページが表示されます。

Fiddlerを見ると、[キャンセル]をクリックした後に3つの要求/応答があります。

  1. ASP.NETのアクセスが拒否されたメッセージ(401.2)

    HTTP/1.1 401不正な 日:金、2012年7月20日午後2時34分21秒GMT サーバーここでは、応答の概要とヘッダがあります:マイクロソフト-IIS/6.0 WWW認証: WWW認証をネゴシエート:NTLM X-パワード・バイ:ASP.NET X-ASPNET-バージョン:4.0.30319 のCache-Control:プライベート のContent-Type:テキストを/ html;文字セット= UTF-8 のContent-Length:1701 プロキシのサポート:

  2. は、あなたがこのページを表示する権限がありませんIISセッションベースの認証の(401.1)

    HTTP/1.1 401不正な たContent長さ:1539 のContent-Type:text/htmlの サーバー:マイクロソフト-IIS/6.0 WWW認証:NTLM TlRMTVNTUAACAAAADAAMADgAAAAF ...(簡潔にするため省略) X-Poweredのバイ:ASP.NET 日:金、20 2012年7月14日14:34:21 GMT プロキシサポート:セッションベース認証

  3. 空の応答

    HTTP/1.1 401不正な 日:金、2012年7月20日午前14時34分21秒GMT サーバー:マイクロソフト-IIS/6.0 WWW認証: WWW認証をネゴシエート:NTLM X-パワード・バイ:ASP.NET X-ASPNET-バージョン:4.0.30319 X-AspNetMvc-バージョン:3.0 のCache-Control:プライベート のContent-Length:0 プロキシのサポート:セッションベースの認証の

401エラーページを表示するにはどうすればよいですか?

アップデート1:

は、ここに私のweb.configエラーのセクションです。

<customErrors mode="RemoteOnly" defaultRedirect="~/Error" /> 

私もHandleErrorAttributeを使用しています。

IISがASP.NETではなく空白のページを返すと思われますが、その証明方法はわかりません。

更新2:

これは興味深いものです。空白のページを更新すると、ASP.NET Access is Deniedというメッセージが表示されます。

+0

まだ推測されていませんが、Username and Passwordページにリダイレクトしようとしていますか?そして、それはすでにそれがビューを表示する何もないユーザーを処理したと思うので? –

+0

これはログインページではなく、ブラウザのログインダイアログです。 – jrummell

+0

ああ、その部分を見て、ごめんなさい。 3回目の試行後、401ページにリダイレクトしていますか?そうでない場合は、同じページに残りますが、サーバーが送信しないため、コンテンツが表示されません。 –

答えて

1

@AndrewHagnerが示唆しているように、私は401リダイレクトを調べた後、この作業を思いついた。それはthis answerに基づいています。 AuthorizeAttributeを実装し、HandleUnauthorizedRequest()を上書きしました。

protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
{ 
    if (!filterContext.HttpContext.User.Identity.IsAuthenticated) 
    { 
     var authenticatedUnauthorizedRouteValues = 
       new RouteValueDictionary(new {controller = "Error", action = "Index"}); 

     filterContext.Result = new RedirectToRouteResult(authenticatedUnauthorizedRouteValues); 
     filterContext.Controller.TempData["message"] = 
       "You are not authorized to view this page."; 
    } 
    else 
    { 
     base.HandleUnauthorizedRequest(filterContext); 
    } 
} 

私が理解するように、これはIISに送信される前にMVCパイプラインで許可されていない要求を捕捉します。これは私に許可されていないページにリダイレクトする機会を与えます。

+0

私はまだ、なぜこれを使わないで空白のページを取得していたのか知​​りたいです。 – jrummell

+2

if(filterContext.HttpContext.User.Identity.IsAuthenticated) 'が必要な場合は、3行目を知っておくだけです。 – Azerothian

+0

良いキャッチ!私はコードを更新しました。 – jrummell

0

web.configファイルに、この方法でユーザーを[Unauthorized]ページにリダイレクトするように設定する必要があります。

<System.Web> 
    //map all the erros presented in the application to the error.aspx webpage 
    <customErrors mode="RemoteOnly" defaultRedirect ="~/error.aspx"> 
    //redirect the user to a Error401.pasx Page after the server get an 401 Error 
    <error statusCode="401" redirect="Error401.aspx" /> 
    </customErrors> 
<System.Web> 

これはうまくいきたいと思います。

+0

違いはありません。 (そして ''は ''の子であるべきです) – jrummell

+0

あなたの右@jrummell、ありがとう! –

関連する問題