好的,当用户输入用户通行证时,我的Active Directory查找工作正常。现在我正在尝试调整该代码以允许单点登录。我有什么:
代码:
WindowsIdentity userIdentity = WindowsIdentity.GetCurrent();
using (PrincipalContext domainContext = new PrincipalContext(ContextType.Domain, "mydomain.com"))
{
this.User = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userIdentity.Name);
FindByIdentity因其中一个错误而失败,具体取决于不同的上下文更改:
未知错误(0x8000500c)堆栈:在System.DirectoryServices.PropertyValueCollection.PopulateList()
未知错误(0x80005000)堆栈:at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
我尝试过的事情包括,以“cn = Users,dc = mydomain,dc = com”和“dc = mydomain,dc = com”的形式将容器名称添加到上下文查找中以及是否包括包括ContextOptions.Negotiate与容器集或容器传递为null。
不知道下一步该去哪儿。我需要用户的所有组名,我尝试使用UserPrincipal.Current.GetGroups或其他任何组件获取组名,但它失败并出现与上述相同的PopulateList()错误。
我错过了一些简单的东西吗?如果我在上下文创建中提供用户/传递它工作正常,所以我不确定是否必须创建AD用户才能查询AD,但如果有的话,这不是一个很好的选择。
我已阅读有关此内容的所有帖子,似乎无法通过它。
答案 0 :(得分:0)
错误0x8000500c
表示Active Directory Datatype Cannot be Converted to/from a Native DS Datatype
。
导致此问题的原因是WindowsIdentity.Name
的格式为DOMAIN\USERNAME
且不是有效的SamAccountName
。
好像您正试图获取当前用户的UserPrincipal
,如果是,请使用UserPrincipal.Current
。