Можно ли повторно использовать один 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 - контекст и вызов метода поддерживают отдельные соединения.

Другие вопросы по тегам