2009-05-21 136 views

回答

2

Shibboleth的發佈與 會話到HTTP請求頭中,基於在屬性接受政策(1.3.x中)中所定義 標題名稱相關聯的用戶屬性或屬性映射(2.X) 文件。根據CGI規範定義的映射規則,這些標題被轉換爲基於 的CGI變量。

你應該意識到這個安全公告的: http://shibboleth.net/community/advisories/secadv_20090615.txt

+0

請提供更新後的鏈接,我有同樣的問題,鏈接無效。請儘快獲得幫助。謝謝 – Ruba 2013-04-05 14:36:11

0

我從來沒有用戶shibboleth,但你可以從Controller.User屬性中獲取有關用戶的信息。它將返回當前線程的通用主體。使用此主體可以檢查用戶是否已通過身份驗證並獲取用戶的登錄名。這是由於登錄後設置了身份驗證Cookie並且此Cookie包含有限數量的信息的原因。並且在登錄後每個請求上只檢查這個cookie(如果它存在並且有效 - 用戶被認證)。
所以如果你需要一些特定的信息,你可以手動加載一個用戶(最好在這裏使用緩存)並檢查你想要的任何東西。
你也可以在請求開始的時候創建並附加你自己的主體,並將必要的信息附加到線程上(例如,在請求開始時從基本主體使用用戶名從db/cache加載用戶,創建並設置自己的主體給線)。在此之後,您可以檢查您需要的用戶的所有屬性。

0

哪裏會附上自己的本金?您在請求開始時說,但如果您不希望每個請求授權,該怎麼辦?

0

你要創建的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