gpt4 book ai didi

c# - UserPrincipal.FindByIdentity() 总是返回 null

转载 作者:太空狗 更新时间:2023-10-29 22:36:21 26 4
gpt4 key购买 nike

我正在使用 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”。

enter image description here

所以我尝试手动使用以下代码:

UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, "UserA");

但我仍然得到 null。

更新 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 属性)进行匹配,则需要传递 IdentityType.SamAccountName


旧答案:但是您似乎要将电子邮件地址发送给它。所以这确实永远不会返回任何东西。

AD 不将电子邮件地址视为唯一标识符,因此您不能对电子邮件地址使用 FindByIdentity

这是一个关于如何通过电子邮件地址搜索的示例:http://doogalbellend.blogspot.ca/2012/03/finding-userprincipal-for-email-address.html

关于c# - UserPrincipal.FindByIdentity() 总是返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37050930/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com