2009-08-25 178 views
3

我有一個網站,我正在研究的內部網和互聯網部署。 2之間的唯一區別是幾個配置設置。表單身份驗證跨Windows身份驗證

互聯網版本工作正常,因爲它只是使用表單身份驗證(它在其web配置中定義),如果沒有登錄用戶被定向到登錄頁面。

Intranet版本有點棘手......當用戶第一次訪問該站點時,http上下文原則對象使用WindowsPrincipal正確設置,但使用該信息我確認允許用戶訪問該應用程序,然後我創建了自己的原型實例。

鑑於此,我想在這裏做一些事情......我想使用WindowsPrincipal對象作爲驗證用戶的基礎,但是從那時起,我們需要使用表單身份驗證(即使用cookie來存儲auth細節等)。我還需要從HTTP上下文中檢索原理的實例,使其成爲我的原型類型。

我最好怎麼去做這件事?在我應該看看global.asax的Session_Start執行授權邏輯,然後以某種方式獲得它來存儲我的自定義原則(因此對於任何請求之後,該實例是我的自定義原則)還是我最好用Application_AuthenticateRequest 。

乾杯 安東尼

回答

2

避免這種情況的會話對象。 Application_AuthenticateRequest是你想要的地方。在那裏,你可以使用WindowsPrincipal,然後轉到數據庫來填充你自己的自定義IPrincipal實現對象。這意味着雖然Application_AuthenticateRequest被調用了很多,但在我的應用程序中,我傾向於緩存角色數據至少幾秒鐘以減少數據庫往返行程。這也適用於表單身份驗證。這兩種方法唯一的區別在於,在Forms場景中,您將從Forms auth模塊獲得一個GenericPrincipal,並且您將使用它來檢索您自己的自定義主體對象而不是WindowsPrincipal。

在Application_AuthenticateRequest中設置HttpContext.Current.User的另一個結果是,與將主體放入Session對象不同,您可以使用聲明性安全性,例如用PrincipalPermissionAttribute裝飾您的方法。

+0

你能否回答http://stackoverflow.com/questions/9588265/understanding-wcf-windows-authentication? – Lijo 2012-03-06 18:13:08