2013-06-28 26 views
3

我建立在集成模式在IIS 7.5上運行的.NET 4.0,ASP.NET MVC 3 Intranet應用程序。 Windows身份驗證用於管理對網站的訪問。 Windows身份驗證模塊已啓用,並且所有其他身份驗證模塊都被禁用。在ASP.NET中,Windows身份驗證日誌失敗時觸發了一個事件嗎? (日誌記錄Windows身份驗證失敗的詳細信息)

目前當用戶提供不當憑證時,Windows認證模塊正確地拒絕該憑證和重新顯示登錄提示。它做了3次,之後顯示了標準的.NET 401 Unauthorized Access頁面。這是預期的和可取的。

我的目標:我希望能夠將失敗的身份驗證嘗試的詳細信息記錄到我自己的自定義事件日誌中。特別是要捕獲嘗試登錄時使用的用戶名。 (我將接受捕獲密碼是不可能出於安全原因,是不可能的。)

是我的目標可能嗎?

我已經建立了一個工作的IHttpModule的模塊,並將其添加爲一個事件處理程序WindowsAuthenticationModule,就像這樣:

myWindowsAuthenticationModule.Authenticate += WindowsAuthentication_Authenticate; 

但我的代碼不會被調用在失敗的登錄嘗試的情況下, ,大概是因爲WindowsAuthenticationModule已經決定登錄失敗,所以沒有任何一點叫我的模塊。我的模塊做一個成功的登錄嘗試後被調用,所以我敢肯定,我的事件處理程序的設置是否正確。

據我所知,WindowsAuthenticationModule不暴露身份驗證失敗時所觸發的事件,這樣的選擇是出於。

任何想法?或者我在咆哮一棵沒有解決方案的樹?

回答

3

我在看同樣的問題,並且看起來好像沒有Windows身份驗證事件,即使Authenticate事件對於窗體和窗口也很常見。

但我找到了解決這個!

http://www.codeproject.com/Articles/11202/Redirecting-to-custom-401-page-when-quot-Access-de

UPDATE

從原來的文章

protected void Application_EndRequest(Object sender, EventArgs e) 
{ 
HttpContext context = HttpContext.Current; 
if (context.Response.Status.Substring(0,3).Equals("401")) 
{ 
    if(User.Identity.IsAuthenticated) 
    { 
     // this means user is authenticated, but 401 still returned 
     // which means no access to page or whatever you are trying to access? 
    } 
} 
} 

UPDATE2

我還發現,這種解決方案並不適用於所有情況。我在不同的環境中測試,所以爲我工作,但不爲別人。

默認情況下,IIS甚至不會運行這段代碼,只是返回它自己的錯誤頁面,你想要做的就是告訴IIS讓應用程序處理錯誤。

<httpErrors existingResponse="PassThrough"> 
</httpErrors> 

現在,這樣說,IIS將不會返回任何更多的自定義錯誤,您將需要在應用程序中處理它們,即。不僅401,而且還有403,405等

+0

+1對於一個創新的想法,但它不能解決問題。我的應用程序在用戶登錄後返回401個響應,但他們的帳戶無權訪問他們嘗試訪問的對象(例如訪問他們無權訪問的客戶帳戶)。因此,對所有401應用這種解決方法沒有任何意義。另外,當網站任意指引我進入登錄頁面時,我討厭它,並且我不會讓我的用戶受到同樣的影響。你的想法讓我想到我需要研究Http子代碼(例如401.XX)是否可以用來區分Windows Auth與其他401s。 –

+0

1年後.... :)那麼,在原來的問題,你只問關於登錄失敗的登錄,這我的建議應該幫助。但你的額外要求只是額外的檢查是不是?添加代碼到原來的答案 – Pavdro

+0

1年前...奇怪!我的SO收件箱昨天有一個新的通知,那是當我看到你的回覆。我去年一定錯過了最初的通知。再次感謝您的回覆! –