2015-08-21 154 views
12

我有一個使用ActiveDirectory進行身份驗證的ASP.NET網站。ASP.NET WindowsAuthentication自定義401未經授權的錯誤頁面

現在,當通過身份驗證的用戶打開一個頁面時,他會自動進行身份驗證。我遇到了一個問題 - 當未經身份驗證的用戶(例如,未定義爲network.automatic-ntlm-auth.trusted-uris屬性的Mozilla Firefox用戶)打開頁面時,IIS將發送401響應並提示輸入登錄名\密碼。

我想要的是不要提示他輸入登錄名\密碼 - 只顯示一個自定義錯誤頁面。這聽起來很簡單 - 通過身份驗證的用戶可以獲得所請求的頁面,未經身份驗證的用戶可以重定向到自定義錯誤頁面。它對於FormsAuthentication來說工作得很好。

但是,現在我已經嘗試了很多方法。任何Web.config重定向都不起作用。即使我清除了一個Response並放置了一個重定向 - 我將得到一個循環,因爲此自定義頁面(*例如,/Error/AccessDenied)也需要身份驗證。標記控制器爲AllowAnonymous什麼也不做。

但是,如果我在IIS管理器中啓用了匿名身份驗證,則當真實身份驗證的域用戶在打開網站時沒有被授權。

我該如何解決這個問題?

+0

你想非IE用戶重定向到另一個頁面?基於用戶代理的URL重寫是一條路。 –

+0

不可能。首先來自瀏覽器的請求始終是匿名的。 IIS總是通過'www.authenticate:negotiate'(或NTLM或兩者)頭以'401 Unauthorized'響應。然後客戶端(瀏覽器)再次使用'Authorization:Negotiate ..hash..'頭部來請求這次。根據可信站點,瀏覽器***將***總是要求憑證。無法顯示自定義錯誤,因爲第一個響應始終爲「401」。 – Abhitalks

+0

你可以編寫一個HTTP模塊並鉤上HttpApplication.PostAuthenticateRequest。從那裏你可以使用HttpContext.RewritePath和/或以你想要的方式使用響應上下文。很難說沒有明確的repro案例。 –

回答

14

感謝@Abhitalks解釋如何在評論中發揮作用。我不知道爲什麼,但我確定IE和谷歌瀏覽器在第一次請求時發送授權標頭,這就是爲什麼只有未經授權的用戶才能得到401響應。在理解了我無法避免401響應後,我決定使用這種簡單的方法,因爲這種行爲是最接近理想的。

我已經添加了以下方法Global.asax

protected void Application_EndRequest(object sender, EventArgs e) 
{ 
    if (Response.StatusCode == 401) 
    { 
     Response.ClearContent(); 
     Response.WriteFile("~/Static/NotAuthorized.html"); 
     Response.ContentType = "text/html"; 
    } 
} 

現在,當用戶打開一個頁面時,服務器會返回他自定義錯誤頁,但與401 Unauthorized頭。

Chrome,IE或配置良好的Firefox Firefox。用戶請求URL,服務器返回帶有401頭的錯誤頁面 - 瀏覽器自動完成授權挑戰,重定向到相同的URL,服務器現在返回正確的頁面和200。用戶不會看到這個錯誤頁面。

未配置的Firefox。用戶請求一個URL,服務器返回帶有401頭的錯誤頁面 - 瀏覽器無法完成授權質詢並提示用戶輸入憑據。

  • 用戶輸入正確的登錄。用戶再次請求相同的URL,獲取一個頁面並確定200。

  • 用戶輸入錯誤的登錄名。瀏覽器會再次提示輸入憑據。

  • 用戶壓按取消。瀏覽器顯示已經與報頭401一起發送的自定義錯誤頁面。該頁面告訴用戶,如果他使用的是Firefox,那麼他應該輸入他的憑據或允許自動NTLM身份驗證。

+0

謝謝,正在尋找這個。爲你+1 – KoenW

1

重要補充Yeldar的評論:

當改變的遠程請求(讀:非本地主機)的響應消息,你需要將以下添加到您的配置文件:

<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

相關問題