c# - 在使用 LDAP 验证之前散列密码

标签 c# ldap directoryentry

我有一个基于网络的工具。在登录表单上,密码将在发送前进行哈希处理。 没问题,数据库只存储散列密码。

现在,我们需要通过 DirectoryEntry 使用 LDAP 登录。 但是构造函数只接受纯密码。

我的问题:如何将散列密码传递给 DirectoryEntry 类?

当前方法:

    public bool isAuthenticated(string domain, string username, string pwd)
    {
        string domainAndUsername = domain + @"\" + username;
        DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd);

        try
        {
            Object obj = entry.NativeObject;
            return true;
        }
        catch
        {
            return false;
        }
    }

最佳答案

我不懂 C#,但就 LDAP 协议(protocol)而言,无法使用已经散列的密码进行身份验证。

为什么在传输之前需要对密码进行哈希处理?

如果要避免通过网络传输,最简单的解决方案是通过 SSL 连接到 LDAP 目录。

附带说明,IMO,传输散列密码不如明文密码安全:

  • 如果攻击者拦截请求,他将能够使用他找到的任何一种方式的数据进行身份验证
  • 如果攻击者成功转储数据库并检索到散列密码,如果他需要做的只是传输该密码以进行身份​​验证,那么存储散列密码的事实将变得毫无用处

编辑:附加信息

我不知道你使用的是哪个 LDAP 目录,但是在 OpenLDAP 上,如果你不使用 bind 操作,你可以实现这种机制(例如,你将无法使用密码策略覆盖).

您可以实现 SASL Proxy Authorization到:

  • 使用技术帐户连接到目录
  • 搜索并检索尝试登录的入口用户
  • 测试自定义散列密码属性是否提供的散列是存储的密码
  • 与另一个具有代理授权的技术帐户重新绑定(bind)以充当此用户

它将允许您仍然受益于用户执行的 ACL 机制和日志系统

但是:这将仅在 OpenLDAP 上可用(或者如果另一个 LDAP 实现提供相同的机制)并且它并不是关于 LDAP 协议(protocol)的最先进的技术;)

关于c# - 在使用 LDAP 验证之前散列密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44001384/

相关文章:

c# - HttpException - Chrome 中超出了最大请求长度

c# - 是否可以创建一个 vb.net 或 c# 应用程序以在没有任何移动应用程序的情况下使用蓝牙向移动设备发送通知?

authentication - 用于 LDAP 身份验证的 Oauth 服务

c# - 为什么在从 C# 而不是从 C++ 访问内存映射文件时会出现拒绝访问异常

c# - 如何将导航栏操作链接固定在右侧

python - AUTH_LDAP_REQUIRE_GROUP 在 django 中如何工作?

linux - LDAP - Univention 企业服务器 - 集中身份验证 - SSO

c# - 从 Active Directory 组获取用户

c# - 如何知道我的 DirectoryEntry 是否真的连接到我的 LDAP 目录?

directoryentry - 给定用户的 SID,我如何获取 AD DirectoryEntry?