2012-05-10 106 views
1

我試圖建立以登錄到使用.NET MVC,基本要求的控制器/行動試圖擅自接入的最佳方式是:記錄/審計403個請求

  1. 如果他們還沒有登錄那麼我們希望將它們重定向到登錄頁面
  2. 如果他們已登錄但沒有正確的頁面憑證,那麼我們希望記錄有關請求的信息,他們是誰,一些HttpRequest等等,然後重定向他們到特定的未經授權的訪問頁面。

1顯然是通過.net mvc [Authorize]屬性過濾器默認處理的。 2我已經部分實現了,我創建了一個特定的Authorization屬性,該屬性擴展了Authorize操作篩選器,該篩選器覆蓋默認的HandleUnauthorizedRequest方法,以檢查一些額外的事情並返回響應代碼爲403的HttpResult。

我在實現其他部分時遇到困難,將信息記錄到數據庫。當然,有一種簡單的解決方法,從自定義屬性本身中進行記錄,但這種方式感覺不對,感覺就像我將屬性本身變得更聰明,然後應該是這樣,在一天結束時它應該只知道關於限制訪問而不是關於將信息記錄到數據庫。

還有另一種解決方案,當它到達未經授權的頁面本身時,它就會記錄下來,它不會感覺不好,但仍然感覺不太正確。

就我個人而言,我希望能夠在請求鏈內的某處處理它,但據我所知,沒有地方可以訪問所有正確的信息。我試過在這裏四處尋找,但還沒有找到任何與我們的解決方案非常相符的東西。

有沒有人在那裏實現類似於我們要做的事情,或者對於應該在哪裏實施這些事情有任何想法。

感謝, MD

回答

2

創建一個新的IHttpModule並登錄的EndRequest事件作弊黑客...

例如

public class UnAuthorizedLoggerHttpModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.EndRequest += ContextOnEndRequest; 
    } 

    private void ContextOnEndRequest(object sender, EventArgs eventArgs) 
    { 
     var app = sender as HttpApplication; 

     if (app == null) return; 

     if (app.Response.StatusCode == (int)HttpStatusCode.Forbidden) 
     { 
      //Log the error 
      //All the user info should be in app.Request 
     } 
    } 
} 
+0

這真是太棒了,正是我們所期待的! – MDo