7

IIS6 に展開された Windows 認証を使用する ASP.NET MVC3 アプリケーションがあります。認証されたユーザーが表示を許可されていないリンクをクリックすると、ユーザー名とパスワードを (ページではなくブラウザーのダイアログで) 入力するように求められます。

ただし、[キャンセル] をクリックするか、無効な資格情報を 3 回入力すると、401 Unauthorized ページが表示される代わりに、空白の白いページが表示されます。

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

  1. ASP.NET アクセスが拒否されましたというメッセージ (401.2)

    HTTP/1.1 401 Unauthorized Date: Fri, 20 Jul 2012 14:34:21 GMT Server: Microsoft-IIS/6.0 WWW-Authenticate: Negotiate WWW-Authenticate: NTLM X-Powered-By: ASP.NET X-AspNet-Version: 4.0.30319 Cache-Control: プライベート Content-Type: text/html; charset=utf-8 Content-Length: 1701 Proxy-Support: セッションベースの認証

  2. IIS このページを表示する権限がありません (401.1)

    HTTP/1.1 401 Unauthorized Content-Length: 1539 Content-Type: text/html Server: Microsoft-IIS/6.0 WWW-Authenticate: NTLM TlRMTVNTUAACAAAADAAMADgAAAAF... (簡潔にするため省略) X-Powered-By: ASP.NET Date: Fri 、2012 年 7 月 20 日 14:34:21 GMT プロキシ サポート: セッションベースの認証

  3. 空の応答

    HTTP/1.1 401 Unauthorized Date: Fri, 20 Jul 2012 14:34:21 GMT Server: Microsoft-IIS/6.0 WWW-Authenticate: Negotiate WWW-Authenticate: NTLM X-Powered-By: ASP.NET X-AspNet-Version: 4.0.30319 X-AspNetMvc-Version: 3.0 Cache-Control: private Content-Length: 0 Proxy-Support: Session-Based-Authentication

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

更新 1:

これが私のweb.configエラーセクションです。

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

も使用してHandleErrorAttributeいます。

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

更新 2:

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

4

2 に答える 2

1

@AndrewHagnerが提案したように、401リダイレクトを調べた後、この回避策を思いつきました。それはこの答えに基づいています。実装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パイプラインで不正な要求をキャッチします。これにより、許可されていないユーザーフレンドリーなページにリダイレクトする機会が得られます。

于 2012-07-20T18:07:43.547 に答える