我正在使用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
时,我需要指定域 Controller 的名称。using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "myDomain"))
{
// code here...
}
然后,当搜索
UserPrincipal
时,我使用了错误的IdentityType
;我正在使用IdentityType.Name
(即帐户名称)而不是IdentityType.SamAccountName
(即用户名)进行搜索。UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, email);
问题已解决。
最佳答案
通过使用IdentityType.Name
,您可以告诉它所传递的值是帐户名称(即cn
属性)。如果要按用户名(sAMAccountName
atrribute)进行匹配,则需要传递IdentityType.SamAccountName
。
旧答案:
但是您似乎正在向其发送电子邮件地址。因此,这的确将一无所获。
AD不会将电子邮件地址视为唯一标识符,因此您不能将FindByIdentity
与电子邮件地址一起使用。
这是有关如何通过电子邮件地址进行搜索的示例:http://doogalbellend.blogspot.ca/2012/03/finding-userprincipal-for-email-address.html