在ASP.NET webapp中,FindByIdentity因PricipalOperationException而失败

pat*_*jbs 3 c# asp.net active-directory visual-studio

我在内部Web应用程序中使用System.DirectoryServices.AccountManagement时遇到了一个问题.错误不是很具描述性,但是这是正在发生的事情:

当我尝试验证AD中是否存在提供的用户ID时,我使用以下代码:

private bool IsWindowsIDValid(string strWindowsID) 
{ 
var context = new PrincipalContext(ContextType.Domain, "DOMAINSERVER", "DC=DOMAINNAME,DC=net"); 
var userPrincipal = UserPrincipal.FindByIdentity(context, strWindowsID); 
return (userPrincipal != null); 
} 
Run Code Online (Sandbox Code Playgroud)

但是,在第二行抛出异常,其中调用FindByIdentity.以下是异常详细信息:

消息:"发生了操作错误."

堆栈跟踪:

在System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()在System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()在System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()在System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()在系统System.DirectoryServices上的System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext context,Type principalType,String identityValue)中的.DirectoryServices.AccountManagement.Principal.FindBdentIdentityWithTypeHelper(PrincipalContext context,Type principalType,Nullable`1 identityType,String identityValue,DateTime refDate) .AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext context,String identityValue)at*****.IsWindowsIDValid(String strWindowsID)in*****.ascx.cs:line 193

如果我尝试检查PrincipalContext的ConnectedServer属性,也会发生同样的错误.但是,我可以尝试根据上下文验证凭据(使用context.ValidateCredentials()),它将通过正常.

关于可能发生的事情的任何想法?我可以在我的机器上的独立控制台脚本中运行此代码 - 当我尝试调试webapp时,这发生在VisualStudio内部的本地开发环境中.这可能是权限问题还是其他问题?我在这一点上很丢失.

我感谢任何帮助!

-Patrick

Jam*_*ing 5

一个老问题,但我有同样的错误.对我来说,问题是如果PrincipalContext没有用户名和密码在它的构造函数中不起作用......每当我调用UserPrincipal(或PrincipalContext就此而言)的任何方法或属性时,我都会得到完全相同的错误消息.

如果您指定具有Active Directory权限的域用户的用户名和密码,则该调用将FindByIdentity成功:

var context = new PrincipalContext(ContextType.Domain, "DOMAINSERVER",
                                   "DC=DOMAINNAME,DC=net", userName, pw); 
var userPrincipal = UserPrincipal.FindByIdentity(context, strWindowsID); 
Run Code Online (Sandbox Code Playgroud)

对我来说,这不是一个解决方案,因为我不会有这两个参数.但这就是为什么你得到了你得到的错误.

根据微软的帮助,按照你的方式运行它应该在调用进程的凭据下运行...但无论我运行的是谁(我已经验证了模拟)调用UserPrincipal对象而没有指定用户名和pw on它PrincipalContext只是不会工作.

詹姆斯,希望姗姗来迟