2010-10-14 4 views
0

Я работаю над веб-проектом, к которому пользователи будут иметь доступ после аутентификации Active Directory. Мой босс контролирует доступ к Active Directory и хочет использовать группы для проверки подлинности приложения, которое я пишу. Он также предоставил мне класс для подключения, чтобы вытащить нужную мне информацию из AD (имя входа и группы активных каталогов), так что это не проблема.Производительность проверки подлинности группы Active Directory

Вот моя проблема: большинство пользователей принадлежат более чем 20 группам AD. Я никогда не работал с AD раньше, поэтому я понятия не имею, если это ненормально высоко, но я знаю, что для ответа на мой запрос для списков групп пользователей требуется 5-6 секунд, поэтому я действительно хочу свести к минимуму количество раз, когда я должен запрашивать группы, тем более, что максимальное использование будет включать около 200-300 пользователей, попавших на страницу в течение нескольких часов.

Это приложение имеет три отдельные группы управления: пользователи, рецензенты и администраторы. Каждая группа имеет собственную коллекцию страниц в соответствующих папках веб-сайта. Каждая папка имеет одну начальную точку (т. Е. Другие будут перенаправляться на эту страницу, если в сеансе не обнаружены соответствующие данные). Эта страница проверяет действительную группу AD только, если IsPostback == false, и читает из записи в объекте Session, чтобы убедиться, что у пользователя есть правильный доступ.

Итак (наконец), вот мой вопрос: могу ли я обрабатывать это самым эффективным способом, или я пропустил простую альтернативу здесь?

ответ

1

Для вашего вопроса выше, да иногда немного медленнее зависит от нагрузки, а не концентрируется на этом, поэтому не изменяйте свою логику, а не перечисляйте все группы пользователей, почему бы не проверить, является ли пользователь членом группы. Для того, чтобы реализовать здесь код

/// <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

Смежные вопросы