2

我有一个可以发送电子邮件的应用程序。现在要求用于ldap 验证用户电子邮件。我对这个概念很陌生。我已获得ldap服务器链接。不知道如何继续。任何文章或点击都会非常有帮助。

这是我正在尝试的代码

public static UserDetail GetUserDetails(string EmailId, string domainName)
{
    UserDetail userDetail = new UserDetail();

    try
    {
        string filter = string.Format("(&(ObjectClass={0})(sAMAccountName={1}))", "person", EmailId);
        string[] properties = new string[] { "fullname" };

        DirectoryEntry adRoot = new DirectoryEntry("LDAP://" + domainName, null, null, AuthenticationTypes.Secure);
        DirectorySearcher searcher = new DirectorySearcher(adRoot);
        searcher.SearchScope = SearchScope.Subtree;
        searcher.ReferralChasing = ReferralChasingOption.All;
        searcher.PropertiesToLoad.AddRange(properties);
        searcher.Filter = filter;
        SearchResult result = searcher.FindOne();

        DirectoryEntry directoryEntry = result.GetDirectoryEntry();
        string displayName = directoryEntry.Properties["displayName"[0].ToStrin();
        string firstName = directoryEntry.Properties["givenName"][0].ToString();
        string lastName = directoryEntry.Properties["sn"][0].ToString();
        string emailId = directoryEntry.Properties["mail"][0].ToString();

        userDetail.EmailId = emailId;
    }
    catch (Exception)
    {

    }
    return userDetail;
}

我想通过单击搜索按钮来实现它。如何调用方法并传递变量。

4

3 回答 3

3

如果您使用的是 .NET 3.5 或更高版本,则可以使用 aPrincipalSearcher和“按示例查询”主体进行搜索:

// create your domain context
PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

// define a "query-by-example" principal - here, we search for a UserPrincipal 
// and with the e-mail of "bruce@example.com"
UserPrincipal qbeUser = new UserPrincipal(ctx);
qbeUser.EmailAddress = "bruce@example.com";

// create your principal searcher passing in the QBE principal    
PrincipalSearcher srch = new PrincipalSearcher(qbeUser);

// try to find that user
UserPrincipal found = srch.FindOne() as UserPrincipal;

if(found != null)
{
    // do whatever here - "found" is the user that matched the e-mail given
}
else
{
    // there wasn't any user with that e-mail address in your AD
}

如果您还没有 - 一定要阅读 MSDN 文章Managing Directory Security Principals in the .NET Framework 3.5,它很好地展示了如何充分利用 .NET Framework 中的新功能System.DirectoryServices.AccountManagement。或查看System.DirectoryServices.AccountManagement命名空间上的 MSDN 文档。

当然,根据您的需要,您可能希望在您创建的“示例查询”用户主体上指定其他属性:

  • DisplayName(通常:名字 + 空格 + 姓氏)
  • SAM Account Name- 您的 Windows/AD 帐户名称
  • User Principal Name- 您的“username@yourcompany.com”样式名称

您可以在 上指定任何属性UserPrincipal并将其用作PrincipalSearcher.

于 2012-10-18T08:43:24.090 回答
1

给定 emailAddress 的输入(类型字符串),此代码将在 LDAP 目录中搜索具有匹配电子邮件地址的用户,并返回有关该用户的一些信息:

string fullName = string.Empty;
            string givenName = string.Empty;
            string distinguishedName = string.Empty;
            string sAMAccountName = string.Empty;
            using (var context = new PrincipalContext(ContextType.Domain, "DOMAIN"))
            {
                using (var searcher = new PrincipalSearcher(new UserPrincipal(context)))
                {
                    foreach (Principal result in searcher.FindAll())
                    {
                        var de = result.GetUnderlyingObject() as DirectoryEntry;

                        if (de.Properties["cn"].Value.ToString().Contains(" "))
                        {

                            //var userEntry = new DirectoryUser(de.Properties["sAMAccountName"].Value.ToString());
                            var currentUserEmail = de.Properties["mail"].Value.ToString().ToLower();
                            if (currentUserEmail == emailAddress)
                            {

                                if (de.Properties["cn"].Value != null)
                                    fullName = de.Properties["cn"].Value.ToString();
                                if (de.Properties["givenName"].Value != null)
                                   givenName = de.Properties["givenName"].Value.ToString();
                                if (de.Properties["distinguishedName"].Value != null)
                                    distinguishedName =de.Properties["distinguishedName"].Value.ToString();
                                if (de.Properties["sAMAccountName"].Value != null)
                                    sAMAccountName = de.Properties["sAMAccountName"].Value.ToString();


                            }
                        }
                    }
                }
            }

它需要参考:

System.DirectoryServices;
System.DirectoryServices.AccountManagement;

我想提一下的一个警告是,目录查找例程可能非常慢。如果您的域中有 100,000 个用户,则此过程将需要一段时间才能运行。我倾向于做的是定期将目录搜索的输出转储到数据库表中,并对该表执行任何查找。数据库转储的频率当然取决于您的业务逻辑。有时我只是在执行新转储之前截断表,而在其他情况下,我转储到“暂存”表,并且仅将“增量”更新应用于活动目录记录表。

于 2012-10-18T07:49:53.833 回答
0
  • 如果可能,请使用 SSL 连接到目录服务器。也可以使用 StartTLS 扩展操作将非安全连接提升为安全连接。
  • 向服务器发送一个 SEARCH 请求,该请求包含客户端希望从其开始搜索的基本 DN、搜索范围(基本、一级或子树)以及使用 LDAP 客户端知道的信息的过滤器将搜索结果缩小到所需用户和属性1.1.
  • 服务器将使用包含匹配搜索请求参数的条目数和匹配的每个条目的可分辨名称的 SEARCH 响应进行响应。
  • 通过安全连接将 BIND 请求传输到目录服务器。BIND 请求包含专有名称和专有名称的凭据
  • 目录服务器将验证凭据并返回带有整数结果代码的 BIND 响应,指示凭据是否与存储在服务器数据库中的凭据匹配

也可以看看

于 2012-10-18T07:56:18.583 回答