UserPrincipal.FindByIdentity() 总是 returns 空
UserPrincipal.FindByIdentity() always returns null
我正在使用 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);
问题已解决。
通过使用 IdentityType.Name
,您告诉它您传递的值是帐户名称(即 cn
属性)。如果您想通过用户名(sAMAccountName
属性)进行匹配,则需要传递 IdentityType.SamAccountName
.
旧答案:
但是您似乎要将电子邮件地址发送给它。所以那确实总是return什么都没有。
AD 不将电子邮件地址视为唯一标识符,因此您不能将 FindByIdentity
与电子邮件地址一起使用。
以下是如何通过电子邮件地址搜索的示例:http://doogalbellend.blogspot.ca/2012/03/finding-userprincipal-for-email-address.html
我正在使用 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);
问题已解决。
通过使用 IdentityType.Name
,您告诉它您传递的值是帐户名称(即 cn
属性)。如果您想通过用户名(sAMAccountName
属性)进行匹配,则需要传递 IdentityType.SamAccountName
.
旧答案: 但是您似乎要将电子邮件地址发送给它。所以那确实总是return什么都没有。
AD 不将电子邮件地址视为唯一标识符,因此您不能将 FindByIdentity
与电子邮件地址一起使用。
以下是如何通过电子邮件地址搜索的示例:http://doogalbellend.blogspot.ca/2012/03/finding-userprincipal-for-email-address.html