2012-07-20 186 views
7

我有一個ASP.NET MVC3應用程序,並將Windows身份驗證部署到IIS6。如果經過身份驗證的用戶單擊了他們未被授權查看的鏈接,則會按照預期提示他們輸入其用戶名和密碼(在瀏覽器對話框中,而不是頁面上)。獲取空白頁而不是401錯誤頁面

但是,在單擊取消或三次輸入無效憑據後,我看到一個空白白頁,而不是看到401未授權頁面。

看着提琴手,點擊取消後有三個請求/迴應。下面是響應摘要和標題:

  1. ASP.NET訪問被拒絕的消息(401.2)

    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 緩存控制:私人 內容類型:文本/ HTML;字符集= UTF-8 的Content-Length:1701 代理支持:基於會話的認證

  2. IIS您無權查看此頁(401.1)

    HTTP/1.1 401未經授權 內容 - 長度:1539 的Content-Type:text/html的 服務器:Microsoft-IIS/6.0 WWW驗證:NTLM TlRMTVNTUAACAAAADAAMADgAAAAF ......(略去了) X供電,通過:ASP.NET 日期:週五,20 Jul 2012 14:34:21 GMT 代理支持:基於會話的身份驗證

  3. 空響應

    HTTP/1.1 401未經授權 日期:星期五,2012年7月20日14時34分21秒GMT 服務器:Microsoft-IIS/6.0 WWW身份驗證:協商 WWW驗證:NTLM X-已啓動方式:ASP.NET X-ASPNET-版本:4.0.30319 X-AspNetMvc-版本:3.0 緩存控制:私人 的Content-Length:0 代理支持:基於會話的驗證

我如何得到這個顯示401錯誤頁面?

更新1:

這裏是我的web.config錯誤部分。我也使用HandleErrorAttribute

我懷疑IIS是返回空白頁而不是ASP.NET,但我不知道如何證明。

更新2:

這很有趣。如果我刷新空白頁面,我看到ASP.NET訪問被拒絕消息。

+0

只是一個猜測,但它試圖將它們重定向回到用戶名和密碼頁面,因爲它們仍然沒有被授權?既然它已經認爲它處理了用戶,那麼視圖就沒有任何東西可以顯示了? – 2012-07-20 15:31:30

+0

它不是一個登錄頁面,它是瀏覽器登錄對話框。 – jrummell 2012-07-20 16:35:21

+0

對不起,沒有看到那部分。第三次嘗試後,您是否將他們重定向到401頁面?如果沒有,那麼你仍然在同一頁面上,但你沒有得到任何內容顯示,因爲服務器不發送任何內容。 – 2012-07-20 17:28:48

回答

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); 
    } 
} 

所以,據我所知,這將捕獲未經授權的請求在MVC管道發送到IIS之前。這使我有機會重定向到用戶友好的未授權頁面。

+0

我仍然想知道爲什麼我沒有這個空白頁面。 – jrummell 2012-07-20 18:16:12

+2

只要讓你知道第3行'if(filterContext.HttpContext.User.Identity.IsAuthenticated)'需要'if(!filterContext.HttpContext.User.Identity.IsAuthenticated)' – Azerothian 2014-10-27 03:52:45

+0

好的!我更新了代碼。 – jrummell 2014-10-27 12:39:55

0

你應該嘗試在你的web.config文件中設置一個規則,以這種方式將用戶重定向到未授權頁面。

<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 2012-07-20 16:45:56

+0

你對@ jrummell,謝謝! – 2012-07-20 16:50:14