我在哪裏可以獲取有關當前連接的用戶的信息?也就是說,shibboleth如何傳遞信息?關於shibboleth和授權的asp.net mvc身份驗證
我可以使用基於從shibboleth獲取的數據的[Authorize]屬性對動作設置一些限制嗎?
我在哪裏可以獲取有關當前連接的用戶的信息?也就是說,shibboleth如何傳遞信息?關於shibboleth和授權的asp.net mvc身份驗證
我可以使用基於從shibboleth獲取的數據的[Authorize]屬性對動作設置一些限制嗎?
Shibboleth的發佈與 會話到HTTP請求頭中,基於在屬性接受政策(1.3.x中)中所定義 標題名稱相關聯的用戶屬性或屬性映射(2.X) 文件。根據CGI規範定義的映射規則,這些標題被轉換爲基於 的CGI變量。
你應該意識到這個安全公告的: http://shibboleth.net/community/advisories/secadv_20090615.txt
我從來沒有用戶shibboleth,但你可以從Controller.User屬性中獲取有關用戶的信息。它將返回當前線程的通用主體。使用此主體可以檢查用戶是否已通過身份驗證並獲取用戶的登錄名。這是由於登錄後設置了身份驗證Cookie並且此Cookie包含有限數量的信息的原因。並且在登錄後每個請求上只檢查這個cookie(如果它存在並且有效 - 用戶被認證)。
所以如果你需要一些特定的信息,你可以手動加載一個用戶(最好在這裏使用緩存)並檢查你想要的任何東西。
你也可以在請求開始的時候創建並附加你自己的主體,並將必要的信息附加到線程上(例如,在請求開始時從基本主體使用用戶名從db/cache加載用戶,創建並設置自己的主體給線)。在此之後,您可以檢查您需要的用戶的所有屬性。
哪裏會附上自己的本金?您在請求開始時說,但如果您不希望每個請求授權,該怎麼辦?
你要創建的Global.asax.cs的方法具有以下簽名
protected void Application_PostAuthenticateRequest()
{
//Your code here.
}
這將被自動調用之前,幾乎什麼都做(MVC將調用此方法,如果它存在,你不必在任何地方「打開」),這是你需要設置校長的地方。例如,假設您有一個名爲RolesHeader
的標題,其中包含角色的逗號分隔值,另一個標頭爲UserId
,其中包含用戶標識。
你的代碼,沒有任何錯誤處理,可能看起來像:
protected void Application_PostAuthenticateRequest()
{
var rolesheader = Context.Request.Headers["RolesHeader"];
var userId = Context.Request.Headers["UserId"];
var roles = rolesheader.Split(',');
var principal = new GenericPrincipal(new GenericIdentity(userId), roles);
Context.User = principal;
}
這是校長/身份的[Authorize]
屬性使用,所以這裏將其設置在請求生命週期的開始意味着[Authorize]
屬性將正常工作。
這樣做的其餘部分是可選的,但我建議:
我喜歡創造實現的IPrincipal和IIdentity的,而不是使用的GenericPrincipal和GenericIdentity我自己的自定義類,所以我的東西更多的用戶信息在裏面。然後,我的自定義Principal和Identity對象具有更豐富的信息,例如分支號碼或電子郵件地址等。
然後,我創建了一個名爲BaseController
控制器具有以下
protected new CustomPrincipal User
{
get
{
return (base.User as CustomPrincipal) ?? CustomPrincipal.GetUnauthorizedPrincipal();
}
}
這讓我訪問我所有的豐富的自定義主要的數據,而不只是什麼在IPrincipal的定義。我所有的真實控制器都繼承自BaseController
,而不是直接從Controller
繼承。
很顯然,當使用這樣的自定義委託人時,在Application_PostAuthenticateRequest()方法中,您將Context.User設置爲您的CustomPrincipal
而不是GenericPrincipal
。
請提供更新後的鏈接,我有同樣的問題,鏈接無效。請儘快獲得幫助。謝謝 – Ruba 2013-04-05 14:36:11