我正在使用 LdapAuthentication 将用户登录到 Active Directory。我想找到用户所属的所有组。我正在使用以下代码:
string adPath = "LDAP://OU=HR Controlled Users,OU=All Users,DC=myDomain,DC=local";
LdapAuthentication adAuth = new LdapAuthentication(adPath);
try
{
if (true == adAuth.IsAuthenticated("myDomain", txtLoginEmail.Text, txtLoginPassword.Text))
{
string email = txtLoginEmail.Text;
using (PrincipalContext context = new PrincipalContext(ContextType.Domain))
{
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, email);
foreach (var group in user.GetGroups())
{
Console.WriteLine(group.Name);
}
}
}
}
catch(Exception e) { /* Handle Error */ }
我的问题是,当我调用 UserPrincipal.FindByIdentity() 时,我总是得到一个空值,即使用户身份验证按预期工作。
为什么会这样?代码或我的方法有问题吗?这是在 ASP.NET 4.0 WebForms 应用程序中运行的。
更新:
显然我一直在使用错误的 IdentityType (cn)。我检查了调试,帐户的名称是“UserA”。
所以我尝试手动使用以下代码:
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, "UserA");
但我仍然为空。
更新 2(已解决):
这个问题有两个方面。在声明PrincipalContext
.
using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "myDomain"))
{
// code here...
}
然后,在搜索时,UserPrincipal
我用错了IdentityType
;我正在搜索IdentityType.Name
- 这是帐户的名称 - 而不是IdentityType.SamAccountName
- 这是用户名。
UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, email);
问题解决了。