首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用C#根据LDAP验证用户身份

使用C#根据LDAP验证用户身份
EN

Stack Overflow用户
提问于 2012-07-19 21:16:02
回答 2查看 97.1K关注 0票数 25

我使用DirectorySearcher在LDAP服务器中搜索用户条目。

代码语言:javascript
复制
DirectoryEntry de = new DirectoryEntry();
de.Path = "LDAP://myserver/OU=People,O=mycompany";
de.AuthenticationType = AuthenticationTypes.None;

DirectorySearcher deSearch = new DirectorySearcher();

deSearch.SearchRoot = de;
deSearch.Filter = "(uid=" + model.UserName + ")";

SearchResult result = deSearch.FindOne();

我可以在result变量中得到预期的输出。

但是,如果我试图通过在目录条目中提供密码来验证同一用户,我总是得到以下错误。

“用户名或密码不正确。”

代码语言:javascript
复制
DirectoryEntry entry = new DirectoryEntry("LDAP://myserver/OU=People,O=mycompany", username, password);
DirectorySearcher search = new DirectorySearcher(
    entry,
    "(uid=" + username + ")",
    new string[] { "uid" }
);

search.SearchScope = System.DirectoryServices.SearchScope.Subtree;
SearchResult found = search.FindOne();   ->>>>>this is where I get wrong credential error.

用户名和密码是针对我要验证的用户的。

谁能告诉我这里我做错了什么,或者如何调试它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-19 21:27:50

此行中的此用户名和密码:

代码语言:javascript
复制
DirectoryEntry("LDAP://myserver/OU=People,O=mycompany", username, password);

应用于具有目录查找权限的帐户。它可以是服务帐户,也可以是测试目的,请尝试使用您自己的帐户。这不应该是您试图验证的人的用户/通行证。

如果要进行身份验证,可以使用PrincipalContext执行以下步骤:

代码语言:javascript
复制
using(var context = new PrincipalContext(ContextType.Domain, "mydomain", "mydomain\serviceAcct", "serviceAcctPass")) {
 //Username and password for authentication.
 return context.ValidateCredentials(username, password); 
}

"serviceAcct“=域用户中拥有目录查找权限的帐户。"serviceAcctPass“=该服务帐户的密码。正如我所说的,对于测试,您可以尝试使用您自己的user/pass上下文。

此外,请确保提供的用户名具有"domain\ username“或"username@domain”格式。

票数 47
EN

Stack Overflow用户

发布于 2019-10-09 15:21:11

在这里,我们将获取active directory用户详细信息,并且可以从web.config文件中使用DomainName和UserRole

代码语言:javascript
复制
bool isAdmin = false;
        RegisterInput model = new RegisterInput();
        NewUserInput usr = new NewUserInput();
        SearchResultCollection results;
        string mobileNumber = string.Empty;
        using (DirectoryEntry domainEntry = new DirectoryEntry("LDAP://" + AppSettings.DomainName))
        {
            using (DirectorySearcher searcher = new DirectorySearcher(domainEntry, "userPrincipalName=" + userName + "@" + AppSettings.DomainName) { Filter = string.Format("(&(objectClass=user)(samaccountname={0}))", userName) })
            {
               results = searcher.FindAll();

                if (results.Count > 0)
                {
                    usr.FirstName = results[0].GetDirectoryEntry().Properties["givenName"].Value.ToString();
                    usr.LastName = results[0].GetDirectoryEntry().Properties["sn"].Value?.ToString();
                    usr.EmailAddress = results[0].GetDirectoryEntry().Properties["mail"].Value?.ToString();
                    mobileNumber = results[0].GetDirectoryEntry().Properties["mobile"]?.Value?.ToString();
                    dynamic userRoleList = results[0].GetDirectoryEntry().Properties["memberOf"];

                    if (userRoleList != null)
                    {
                        foreach (var role in userRoleList)
                        {
                            string[] split = role.ToString().Split(new string[] { "," }, StringSplitOptions.RemoveEmptyEntries);
                            bool result = split.Any(x => x.ToLowerInvariant() == AppSettings.UserRole.ToLowerInvariant());
                            if (result)
                            {
                                isAdmin = true;
                                break;
                            }
                        }
                    }
                }
            }
        }

        model.NewUser = usr;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11561689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档