我有一个 MVC Intranet 应用程序,最近从 .Net 4 升级到 4.6.1。此应用程序从 Active Directory 查询用户详细信息,以加载控制器的 User.Identity 属性中不可用的详细信息,并且直到最近才完美地完成此操作。代码看起来像这样:
public static void foo()
{
var usr = LookupUser("MyDomain", "jbloggs");
...
}
private static UserPrincipal LookupUser(string domain, string username)
{
Console.WriteLine($"Lookup {domain}\\{username}");
using (var ctx = new PrincipalContext(ContextType.Domain, domain))
{
using (var user = UserPrincipal.FindByIdentity(ctx, IdentityType.SamAccountName, username))
{
if (user == null)
{
Console.WriteLine("User not found");
return;
}
Console.WriteLine($"Found {domain}\\{username}");
Console.WriteLine($"DisplayName = {user.DisplayName}");
Console.WriteLine($"Office = {user.GetString("physicalDeliveryOfficeName")}");
Console.WriteLine("");
return user;
}
}
}
在 Visual Studio 2015 中调试时,代码运行良好,但在 IIS 机器(Windows Server 2008 R2 上的 v6.1 SP1)上运行时,调用 UserPrincipal.FindByIdentity() 时会引发 COMException (0x80005000)
Web应用程序运行在专用的应用程序池上,其设置如下:
- .Net框架版本= v4.0
- Identity = MyDomain\MyAppServiceUser(非交互式 AD 用户帐户)
- 加载用户配置文件 = false
所有其他设置均按照默认值。应用程序本身在启用匿名和 Windows 身份验证的情况下运行。服务器安装了 .Net 4.6.1,并且 Intranet 应用程序的所有其他元素似乎都运行良好。
谷歌搜索死了这个问题,大多数答案似乎表明这是服务帐户查询 AD 的权限的问题。为了确认应用程序池运行的服务帐户确实有权查询 Active Directory,我在控制台应用程序中使用了上述代码,并以我自己和服务器上的服务帐户的身份运行它 - 在这两个应用程序中实例它工作得很好。它只有在 IIS 下运行时才会崩溃。
我尝试了多种创建PrincipalContext(包括OU容器路径等)的变体,但结果始终相同。
我正在为此努力,所以任何帮助将不胜感激。
更新 - 附加详细信息
- 异常类型:System.Runtime.InteropServices.COMException
- 异常消息:未知错误 (0x80005000)
- 堆栈跟踪:
在 System.DirectoryServices.DirectoryEntry.Bind(布尔 throwIfFail)
在 System.DirectoryServices.DirectoryEntry.Bind() 处
System.DirectoryServices.DirectoryEntry.get_AdsObject() 位于
System.DirectoryServices.PropertyValueCollection.PopulateList() 位于
System.DirectoryServices.PropertyValueCollection..ctor(DirectoryEntry
条目,字符串属性名称)位于
System.DirectoryServices.PropertyCollection.get_Item(字符串
属性名称)位于
System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInitNoContainer()
在
System.DirectoryServices.AccountManagement.PrincipalContext.DoDomainInit()
在
System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
在
System.DirectoryServices.AccountManagement.PrincipalContext.get_QueryCtx()
在
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithTypeHelper(PrincipalContext
上下文,类型主体类型,可为 Nullable`1 身份类型,字符串
身份值、日期时间参考日期)位于
System.DirectoryServices.AccountManagement.Principal.FindByIdentityWithType(PrincipalContext
上下文、类型主体类型、身份类型身份类型、字符串
身份值)在
System.DirectoryServices.AccountManagement.UserPrincipal.FindByIdentity(PrincipalContext
上下文、IdentityType 身份类型、字符串identityValue)位于
Apollo.Security.ActiveDirectoryUser.Find(字符串身份名称)