2010-12-17 69 views
4

我正在使用讨论的解决方案here来对我的ASP.NET Web应用程序中的活动目录进行身份验证。我写了一个简单的ADMembershipProvider类,它与FormsAuthentication一起使用。在本地运行项目时工作正常,但在部署到网络中的服务器时,ValidateUser调用需要很长时间(大约20秒)。使用PrincipalContext.ValidateUser时的性能问题

//Assumes using System.DirectoryServices.AccountManagement 
public override bool ValidateUser(string username, string password) { 
    using (var context = new PrincipalContext(ContextType.Domain)) { 
     return context.ValidateCredentials(username, password); 
    } 
} 

我尝试添加容器参数上msdn到PrincipalContext构造函数的记载,但这些参数似乎没有产生任何影响任何责任。

using (var context = new PrincipalContext(ContextType.Domain, "MyDomain", "OU=MyCompany,DC=some,DC=stuff")) { 
    return context.ValidateCredentials(username, password); 
} 

我们的网络中至少有两台不同的服务器存在同样的问题。服务器连接到AD并运行操作系统Windows服务器2003 SP2(IIS6)

我的一个想法是,该问题可能与我们的域对其他域具有某些信任并且它们以某种方式在验证用户时涉及。但是,我们试图验证的用户仅在“我们的”AD中存在。

+0

你是在IISUser或网络服务下运行的站点/ apppool吗? 后者可能会更快,但建议不要在该帐户下运行网站。 – MarcelDevG 2010-12-17 12:34:13

+0

好的,谢谢,该网站已经作为网络服务运行,虽然 – 2010-12-17 14:36:29

+1

我想这是因为你传递NetBIOS名称到你的PrincipalContext()。尝试传入DNS域名。 – 2010-12-24 07:36:23

回答

4

遇到此问题,必须使用ValidateCredentials(string, string, ContextOptions)方法来传递适当的枚举组合以访问我们的环境中的ActiveDirectory连接。