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

我正在努力解决在我的内部Web应用程序中使用System.DirectoryServices.AccountManagement的问题。 错误不是很具描述性,但是这里发生了什么:

当我尝试validationAD中是否存在提供的用户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); } 

但是,在调用FindByIdentity的第二行抛出exception。 以下是exception详细信息:

消息:“发生了操作错误。”

堆栈跟踪:

System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()at System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()at System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()at System 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属性,也会发生同样的错误。 但是,我可以尝试根据上下文validation凭据(使用context.ValidateCredentials()),它将通过正常。

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

我感谢任何帮助!

-Patrick

一个老问题,但我有同样的错误。 对我来说,问题是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); 

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

根据微软的帮助,按照你的方式运行它应该在调用进程的凭据下运行…但无论我运行的是谁(并且我已经validation了模拟)调用UserPrincipal对象而没有指定用户名和pw在它的PrincipalContext上将无法正常工作。

詹姆斯希望姗姗来迟

对旧问题的另一个迟来的答案但是,这篇文章帮我解决了我的问题: http : //support.microsoft.com/kb/329986

我得到的“操作错误”类似于这篇文章中的错误。

线索是建议在您的网络应用程序之外测试它。 所以我创建了一个控制台应用程序,添加了对System.DirectoryServices.AccountManagement的引用,并输入了以下代码:

 private static void Main(string[] args) { var adGroups = new List(); using (var principalContext = new PrincipalContext(ContextType.Domain)) { using (var user = UserPrincipal.FindByIdentity(principalContext, @"MYDOMAIN\MYUSERNAME")) { if (user == null) return; var groups = user.GetAuthorizationGroups(); adGroups.AddRange(from @group in groups where @group.Name.ToUpper().Contains("SOME-STRING-COMMON-TO-ALL-THE-AD-GROUPS-PERTINENT-TO-MY-MVC-APP") select @group.Name); } } } 

这很有效,所以我当时确信我的问题是MS文章中描述的“双跳”问题。

解决方案是确保在我的web.config文件中打开模拟。 (这是一个内部网应用程序,所以我打开了Windows身份validation模式,然后启用了模拟;这解决了它)。