【问题标题】:How to authenticate in LDAP?如何在 LDAP 中进行身份验证?
【发布时间】:2012-12-30 22:13:35
【问题描述】:

我正在尝试在 .NET 中使用 LDAP 创建一个简单的身份验证系统。 我正在检查 .NET 中的一些命名空间,并简单地将标准代码 sn-p 如下所示。

DirectoryEntry de = new DirectoryEntry(path,username,password);

DirectorySearcher s = new DirectorySearcher(de);
s.Filter = "(&(cn=" + username2 + "))";

SearchResult result = s.FindOne();
if (result != null) {
    Console.WriteLine("User exists");
} else {
    Console.WriteLine("User does not exist");
}

我有一个管理员用户名和密码,usernamepassword,用于验证客户端应用程序。我有第二个用户名和密码,username2password2,需要在 LDAP 中检查才能登录。

username 是管理员帐户,username2 只是 LDAP 中的用户。那么如何查看username2的密码呢?

【问题讨论】:

  • 类似于:stackoverflow.com/questions/400872/… 我更喜欢使用 username2 和 userpass2 创建第二个目录条目,然后尝试访问其中的某些内容,并捕获异常以确定它是否无效的解决方案跨度>
  • @Brandon 感谢您的回复。但是当我做类似的思考时, irectoryEntry de1 = new DirectoryEntry(path,username2,password2);我收到了无效的用户名和密码错误。

标签: c# .net active-directory ldap


【解决方案1】:

我猜我在 VB 中有一些东西可以帮助你。几天前和我的同事一起研究这个。让我知道—— 代码:

    Dim cookie As HttpCookie = New HttpCookie("username")
    cookie.Value = TextBox1.Text
    cookie.Expires = DateAndTime.Now.AddHours(12)
    Response.Cookies.Add(cookie)
    Dim entry As New DirectoryEntry("LDAP://xyz.com/dc=xyz,dc=com", TextBox1.Text, TextBox2.Text)
    Try
        Dim obj As New Object
        obj = entry.NativeObject
        Dim search As New DirectorySearcher(entry)
        search.Filter = "(SAMAccountName=" + TextBox1.Text + ")"
        search.PropertiesToLoad.Add("cn")
        Dim result As SearchResult
        result = search.FindOne()
        If result.Equals(Nothing) then
            MsgBox("Try Again with valid username")
        Else
            MsgBox("User Found!")
        Response.Redirect("~/Dashboard.aspx")
        End If
    Catch ex As Exception
        MsgBox(ex.ToString)
    End Try

End Sub

【讨论】:

    【解决方案2】:

    一种稍微落后(且笨拙)的方法是以用户身份登录并尝试检索某些内容,然后将异常视为无效密码:

    static bool CheckUser(string userName, string password) 
    {
        var adSettings = ConfigurationManager.ConnectionStrings["ActiveDirectory"];
        if (adSettings == null ||
            string.IsNullOrWhiteSpace(adSettings.ConnectionString))
        {
            return false;
        }
    
        try
        {
            using (var de = new DirectoryEntry(adSettings.ConnectionString, userName, password))
            {
                // This should throw an exception if the password is wrong
                object nativeObject = de.NativeObject;
            }
        }
        catch (DirectoryServicesCOMException)
        {
            // Wrong password
            return false;
        }
        catch (System.Runtime.InteropServices.COMException)
        {
            // Can't connect
            return false;
        }
    
        return true;
    }
    

    【讨论】:

    • 非常感谢您的回复,但这也无效...用户名仅存在于 LDAP 中而不是计算机中。
    • @Arda 我想我有点困惑 - 我以为你有第二个用户的名称和密码并想要验证它们,这是不正确的吗?以管理员身份登录后是否要获取第二个用户的密码?
    • @Arda 如果是这种情况(您想读取密码),那么 LDAP 无法帮助您 - 它会验证用户的密码,但它不应该为您提供该用户的密码纯文本(它甚至不应该将它们存储在纯文本中)。
    • 我知道我无法从 LDAP 检索密码。也许我不是很清楚,让我再解释一下……我有一个系统用户,我用它来连接 LDAP(DirectoryEntry 构造函数中的用户名),我还有另一个用户,它不是系统中的用户,但在LDAP,并且在 LDAP 中也有密码。我想检查第二个用户是否可以根据 LDAP 的信息登录我的应用程序。
    • @Arda 所以第二个用户提供了您要在 LDAP 中检查的用户名和密码,但是您有一个实际应用程序运行的不同用户?为什么不在这里使用我的功能来验证第二个用户,然后以管理员用户身份登录来执行其他所有操作?我错过了什么吗?
    猜你喜欢
    • 2021-09-02
    • 2015-07-28
    • 2014-02-28
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-11
    • 1970-01-01
    相关资源
    最近更新 更多