2010-10-14 125 views
0

我正在開發基於Web的項目,用戶在通過Active Directory驗證後將訪問該項目。我的老闆控制着對Active Directory的訪問,並希望使用組來處理我正在編寫的應用程序的身份驗證。他還爲我提供了一個類,用於連接以從AD(登錄名和活動目錄組)中獲取所需的信息,因此這不是一個問題。Active Directory組驗證性能

這是我的問題:大多數用戶屬於超過20個AD組。我從來沒有與AD合作過,所以我不知道這是否異常高,但我知道AD需要5-6秒才能響應我對用戶組列表的請求,所以我真的想要最大限度地減少我不得不請求羣組的次數,特別是因爲峯值使用將涉及大約200-300個用戶在幾個小時內點擊該頁面。

此應用程序有三個獨立的控制組:用戶,審閱者和管理員。每個組在其各自的網站文件夾中都有自己的頁面集合。每個文件夾都有一個入口點頁面(即,如果在會話中找不到相關數據,其他文件夾將重定向到此頁面)。只有在IsPostback == false的情況下,此頁面纔會檢查有效的AD組,並從Session對象中的條目讀取以確保用戶具有正確的訪問權限。所以(最後),這裏是我的問題:我是以最有效的方式處理這個問題,還是忽略了一些簡單的選擇?

回答

1

對於你上面的問題,是的AD有時有點慢取決於負載,而不是專注於爲什麼不改變你的邏輯,而不是枚舉所有的用戶組爲什麼不檢查用戶是否是組的成員。爲了在這裏實現它的代碼是

/// <summary> 
/// Checks if user is a member of a given group 
/// </summary> 
/// <param name="sUserName">The user you want to validate</param> 
/// <param name="sGroupName">The group you want to check the membership of the user</param> 
/// <returns>Returns true if user is a group member</returns> 
public bool IsUserGroupMember(string sUserName, string sGroupName) 
{ 
    UserPrincipal oUserPrincipal = GetUser(sUserName); 
    GroupPrincipal oGroupPrincipal = GetGroup(sGroupName); 

    if (oUserPrincipal == null || oGroupPrincipal == null) 
    { 
     return oGroupPrincipal.Members.Contains(oUserPrincipal); 
    } 
    else 
    { 
     return false; 
    } 
} 

或者即使你仍想喜歡使用ennumeration一部分,爲什麼不ennumerate只能在特定的OU的組,而不是像這樣

/// <summary> 
/// Gets a list of the users group memberships 
/// </summary> 
/// <param name="sUserName">The user you want to get the group memberships</param> 
/// <param name="sOU">The OU you want to search user groups from</param> 
/// <returns>Returns an arraylist of group memberships</returns> 
public ArrayList GetUserGroups(string sUserName, string sOU) 
{ 

    ArrayList myItems = new ArrayList(); 
    UserPrincipal oUserPrincipal = GetUser(sUserName); 

    PrincipalSearchResult<Principal> oPrincipalSearchResult = oUserPrincipal.GetGroups(GetPrincipalContext(sOU)); 

    foreach (Principal oResult in oPrincipalSearchResult) 
    { 
     myItems.Add(oResult.Name); 
    } 
    return myItems; 

} 
/// <summary> 
/// Gets the principal context on specified OU 
/// </summary> 
/// <param name="sOU">The OU you want your Principal Context to run on</param> 
/// <returns>Retruns the PrincipalContext object</returns> 
public PrincipalContext GetPrincipalContext(string sOU) 
{ 
    PrincipalContext oPrincipalContext = new PrincipalContext(ContextType.Domain, sDomain, sOU, ContextOptions.SimpleBind, sServiceUser, sServicePassword); 
    return oPrincipalContext; 
}   
整個目錄更好

最後,作爲一個提示,如果您重視安全而不是速度,那麼我不會建議IsPostback == false,這樣如果某個用戶的安全組成員身份有任何更改,那麼您將能夠在下一個進程中更好地捕獲它。

對於全面實施AD方法請參閱這裏 如果您使用的是.NET 2.0

http://anyrest.wordpress.com/2010/02/01/active-directory-objects-and-c/

,或者如果您使用的是.NET 3.5或4.0

http://anyrest.wordpress.com/2010/06/28/active-directory-c/

+0

謝謝!這正是我現在正在做的 - 我的老闆重寫了他的組員成員函數,通過正確地輪詢Active Directory來加快結果。我不認爲我在問題中指定了這一點,但他的組員成員函數最初將所有用戶的組從AD中移出並遍歷它們以檢查所請求的組,這就是爲什麼我決定將所有組拉回一次,並從他的團體成員函數中分別檢查我的三個小組。 – jwiscarson 2010-11-02 22:53:22

相關問題