4

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

可以PrincipalContext进入不再工作的坏状态吗?

4

2 回答 2

2

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

于 2016-09-05T02:07:16.340 回答
1

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

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

编辑 :

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

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

PrincipalContext 类上的两个 ValidateCredentials 方法提供凭据验证。您首先使用要验证的目录创建 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=微软,C=美国");

// 判断用户是否可以验证到目录 Console.WriteLine( ldsContext.ValidateCredentials( "user1@adam", "Password1", ContextOptions.SimpleBind + ContextOptions.SecureSocketLayer));

当您想要快速有效地验证许多不同的用户凭据集时,此方法最有用。您为相关目录存储创建单个 PrincipalContext 对象,并 为每次调用 ValidateCredentials 重用该对象实例。 PrincipalContext 可以重用与目录的连接,从而带来 良好的性能和可伸缩性。并且对 ValidateCredentials 的调用 是线程安全的,因此您的实例可以 跨线程用于此操作。重要的是要注意,用于创建 PrincipalContext 的凭据不会通过调用 ValidateCredentials 进行更改——上下文和方法调用保持单独的连接。

于 2016-09-05T02:53:25.853 回答