3

我正在實體框架5中工作。我們使用Microsoft Active Directory進行用戶認證。我們正在使用適當的n層體系結構,因此大多數情況下,業務層對用戶界面沒有任何意識。如何檢測當前用戶的審覈日誌?

現在我們需要保持一個完整的審計線索:每次在數據庫上發生任何寫入操作時,我們都必須將其保存到我們的審計日誌以及誰進行了更改。

捕捉寫入應該比較簡單;我將在我的數據上下文中覆蓋SaveChanges(),並使用ObjectStateManager查找所有插入,更新和刪除操作。真正的問題將是檢測當前用戶是誰,因爲認證是在表示層完成的,業務層DLL將託管在IIS上,爲任何數量的客戶端進程提供服務。

是否有某種方法可以檢測客戶端在業務層中使用的身份驗證憑證?我絕對不希望將用戶ID傳遞給API中的每個接口!

(FWIW,我還使用EntityFramework.Extended,它理應有一些本地的審計日誌功能,但documentation是遠遠不夠的。成功地利用這個任何人只要有任何的經驗嗎?它是否能有助於?)

+0

表示層是業務層的可信子系統嗎? – TGlatzer

+0

我認爲這是一個**內聯網**應用程序? –

+0

@ Grumbler85我真的不明白這個問題。它將如何被信任?表示層具有對BL的引用,而不是其他方式。 –

回答

2

你可以考慮在帶外傳遞最終用戶的身份,而不是將其添加到每個方法簽名。

例如,如果您使用的是WCF,則可以創建一個行爲,將自定義SOAP頭注入客戶端,並處理自定義頭的服務器端。

UPDATE

評論的問題似乎暗示DLL直接從ASP.NET MVC應用程序訪問,而不是通過一個Web服務。我已經從你的說法認爲:

業務層DLL將被託管在IIS,維護任意數量的客戶端的處理

,它是從多個ASP.NET MVC應用程序調用Web服務。

如果它只是一個包含在您的ASP.NET MVC應用程序中的DLL,它非常簡單。

  • HttpContext.Current.User將包含連接的客戶端的身份。

  • 您不應該在業務層中使用HttpContext,而應該確保Thread.CurrentPrincipal設置爲與HttpContext.Current.User相同的主體。

    如果您使用的是ASP.NET RoleProvider,則會自動爲您完成。如果不是,你可能需要手動完成,例如在global.asax的AuthorizeRequest事件處理程序中。

然後在業務層訪問終端用戶身份Thread.CurrentPrincipal.Identity.Name

+0

我們正在使用ASP.NET MVC,HTML 5.你會怎麼做? –

+0

您如何在表示層(ASP.NET MVC)和業務層之間進行通信?業務層是否託管在IIS Web服務中(表現層如何對最終用戶進行身份驗證(Windows身份驗證或窗體身份驗證)? – Joe

+0

它只是一個包含在ASP.NET MVC應用程序中的DLL。看看是否有用,謝謝! –

3

如果您已正確配置了身份驗證(例如,表單或Windows身份驗證),然後Thread.CurrentPrincipal保證引用提出請求的用戶。