Можно ли повторно использовать один PrincipalContext в течение всего жизненного цикла приложения?
Может ли приложение создать PrincipalContext
один раз, а затем повторно использовать его для жизни приложения? Это позволит избежать потери производительности воссоздания PrincipalContext
с такими же деталями перед каждым вызовом Active Directory.
Может PrincipalContext
войти в плохое состояние, где оно больше не будет работать?
2 ответа
Пока вы не получаете доступ к PrincipalContext
или объекты, которые вы получаете от него несколькими потоками, вы должны иметь возможность сохранять один и тот же контекст в течение всего времени жизни приложения.
Ничто в природе класса или его документации не предполагает, что у него ограниченный срок службы.
MSDN не упоминает, что это потокобезопасный, однако я не могу обнаружить какие-либо изменяемые свойства или методы, которые бы изменяли состояние объекта (РЕДАКТИРОВАТЬ: кроме Dispose()
метод), который в основном предполагает, что это может быть хорошо для использования в нескольких потоках. Хотя базовые методы Getter или методы могут возвращать контекстные результаты потоков, которые могут не соответствовать вашему поведению.
РЕДАКТИРОВАТЬ:
Я цитирую MSDN Magazine январь 2008 г. (.NET 3.5) и сомневаюсь, что это изменилось
В.NET Framework 3.5 AccountManagement обеспечивает мощь и простоту использования, предлагаемую реализацией ActiveDirectoryMembershipProvider в ASP.NET для программистов, работающих в любой среде. Кроме того, пространство имен AccountManagement позволяет вам при необходимости аутентифицировать учетные данные в локальной базе данных SAM.
Два метода ValidateCredentials в классе PrincipalContext обеспечивают проверку учетных данных. Сначала вы создаете экземпляр PrincipalContext, используя каталог, который вы хотите проверить, и указываете соответствующие параметры. После получения контекста вы проверяете, возвращает ли ValidateCredentials значение true или false на основе предоставленных значений имени пользователя и пароля. На рисунке 12 показан пример аутентификации пользователя в AD LDS.
Рисунок 12 Аутентификация пользователя в AD LDS (закрыть рисунок 12) // установить контекст с AD LDS PrincipalContext ldsContext = new PrincipalContext (ContextType.ApplicationDirectory, "sea-dc-02.fabrikam.com:50000", "ou = ADAM Users, O = Microsoft, C = US ");
// определить, может ли пользователь выполнить проверку в каталоге Console.WriteLine( ldsContext.ValidateCredentials( "user1@adam", "Password1", ContextOptions.SimpleBind + ContextOptions.SecureSocketLayer));
Этот подход наиболее полезен, когда вы хотите быстро и эффективно проверить множество различных наборов учетных данных пользователя. Вы создаете один объект PrincipalContext для рассматриваемого хранилища каталогов и повторно используете этот экземпляр объекта для каждого вызова ValidateCredentials. PrincipalContext может повторно использовать соединение с каталогом, что приводит к хорошей производительности и масштабируемости. А вызовы ValidateCredentials являются поточно-ориентированными, поэтому ваш экземпляр можно использовать в разных потоках для этой операции. Важно отметить, что учетные данные, используемые для создания PrincipalContext, не изменяются при вызовах ValidateCredentials - контекст и вызов метода поддерживают отдельные соединения.