可以在应用程序的生命周期中重用单个PrincipalContext吗?

时间:2016-09-05 01:49:35

标签: c# .net active-directory principalcontext

应用程序可以创建一次PrincipalContext,然后在应用程序的生命周期内重用它吗?这样可以避免在每次调用Active Directory之前使用相同的详细信息重新创建PrincipalContext的性能。

PrincipalContext可以进入不再有效的状态吗?

2 个答案:

答案 0 :(得分:1)

只要您没有访问PrincipalContext或多个线程从中获取的对象,您就应该能够在应用程序的整个生命周期内保持相同的上下文。

答案 1 :(得分:0)

该类或其文档的性质没有任何内容表明它的生命周期有限。

MSDN没有提到它是线程安全的,但我无法发现任何可变的属性或方法会改变对象状态(编辑:除了Dispose()方法),这基本上表明在多个线程中使用可能没问题。虽然底层的Getters或方法可以返回线程上下文结果,这可能不是您所追求的行为。

编辑:

我引用MSDN杂志2008年1月(.NET 3.5),我怀疑这已经改变了

  

在.NET Framework 3.5中,AccountManagement提供了强大功能   和ActiveDirectoryMembershipProvider提供的易用性   在ASP.NET中实现在任何环境中工作的程序员。   此外,AccountManagement命名空间允许您   如果需要,请对本地SAM数据库进行身份验证。

     

PrincipalContext类上的两个ValidateCredentials方法   提供凭证验证。首先创建一个实例   PrincipalContext使用您要验证的目录和   指定适当的选项。获得上下文后,进行测试   ValidateCredentials是否返回true或false   提供的用户名和密码值。图12显示了一个例子   在AD LDS中验证用户。

     

图12在AD LDS中验证用户(关闭图12)//   使用AD LDS建立上下文PrincipalContext ldsContext =       新的PrincipalContext(           ContextType.ApplicationDirectory,           “sea-dc-02.fabrikam.com:50000”           “ou = ADAM用户,O = Microsoft,C = US”);

     

//确定用户是否可以验证目录   Console.WriteLine(       ldsContext.ValidateCredentials(           “USER1 @亚当”,           “密码1”,           ContextOptions.SimpleBind +           ContextOptions.SecureSocketLayer));

     

当您想要验证许多不同的方法时,此方法最有用   快速有效地设置用户凭证。 您创建一个   有问题的目录存储的PrincipalContext对象并重用   每次调用ValidateCredentials时的对象实例。在    PrincipalContext可以重用与目录的连接,   可带来良好的性能和可扩展性。并致电    ValidateCredentials是线程安全的,因此可以使用您的实例   跨线程执行此操作。重要的是要注意到   用于创建PrincipalContext的凭据不会更改   调用ValidateCredentials - 上下文和方法调用维护   单独的连接。