【问题标题】:How to use LDAP credentials offline?如何离线使用 LDAP 凭据?
【发布时间】:2009-02-24 10:31:04
【问题描述】:

我想使用 LDAP 服务器(可能是 Apache directory)来管理应用程序的登录名和凭据。有时,应用程序需要在不连接 LDAP 服务器的情况下脱机工作(在笔记本电脑上)。

在本地复制凭据的最佳方法是什么?

我已经考虑过了:

  • 使用Mitosis 在笔记本电脑上复制 LDAP 服务器。

    但这将是一个相当“繁重”且复杂的解决方案。而且有丝分裂似乎还没有结束。

  • 将凭据导出为可存储在笔记本电脑上的 LDIF 文件。

    但是我需要一种方法来检查 LDIF 文件是否真的来自 LDAP 服务器(该文件应该包含一种签名)。此外,我想拒绝超过一周未更新的 LDIF 文件。如果我可以避免自己实施签名和年龄检查,那就太好了。

还有其他可以帮助我的想法或工具吗?

已编辑的编辑:我查看了 Kerberos,因为 documentation of the Java-Kerberos-API 似乎说可以在本地缓存中使用缓存票证,我认为这可能是我的解决方案.此外,Kerberos 可以作为插件添加到 Apache Directory。 但是 Kerberos 缓存存储解密的票据(旨在与其他应用程序共享它们)。我需要票证的加密版本才能在离线会话期间检查用户密码。结论:Kerberos 没有为我的问题提供简单的解决方案。

【问题讨论】:

  • 笔记本下线前从未登录过的用户是否必须在笔记本下线后才能登录?
  • 如果用户必须在线登录一次才能离线登录,这可能是可以的。

标签: authentication ldap kerberos ldif


【解决方案1】:

知道如果用户必须在线登录一次才能离线登录可能没问题,请考虑以下算法:

  1. 用户为您的应用程序提供(username + password)
  2. 应用程序尝试联系LDAP 进行身份验证
    • 在线工作? (例如连接成功)
      1. 应用程序使用 (username + password) 对 LDAP 进行身份验证
        • 认证成功了吗?
          1. 应用程序存储或更新hash(password) 作为(cached_credentials) 用于(username) 到本地安全存储中
          2. 应用程序在经过身份验证 [[STOP]]后继续
        • 身份验证失败?
          1. 应用程序以未经身份验证(凭据不正确)[[STOP]]
    • 离线工作? (例如网络错误)
      1. 应用程序尝试从本地安全存储中检索(cached_credentials) for (username)
        • (cached_credentials) 存在 AND(1 week) 更新吗?
          1. 应用程序将(cached_credentials)hash(password) 进行比较
            • 匹配?
              1. 应用程序在经过身份验证 [[STOP]]后继续
            • 不匹配?
              1. 应用程序以未经身份验证(凭据不正确)[[STOP]]
        • (cached_credentials) 不存在 OR(1 week) 晚?
          1. 应用程序以未经身份验证(网络错误)[[STOP]]

顺便说一下,这是(或曾经是 IIRC)Windows NT+ 用于针对域控制器进行用户身份验证的相同模型。登录后,将尝试对域控制器进行身份验证,并创建或更新用户配置文件的本地(缓存)版本。如果域控制器不可用,则会提示用户继续对本地(缓存)配置文件(如果存在)中捕获的凭据进行身份验证。


编辑

  • 是的,从本质上讲,这与在本地复制 ldif 文件的解决方案相同,只是在离线时不必解析 ldif。 :)
  • 据了解,您可以在缓存中存储任何附加属性(权限等)
  • 还可以理解,“安全存储”至少是经过签名的。 :) 您可以使用 SHA-1 哈希和密钥轻松完成此操作,或者您可以使用平台上可用的成熟加密提供程序(或在 Java 中,如果使用 Java。)您不需要加密它因为里面没有存储任何秘密信息。

【讨论】:

  • 感谢您编写详细的算法。但实际上它与使用 ldif 文件的解决方案大致相同:将 ldif 文件视​​为“本地安全存储”。我仍然必须自己管理这个本地安全存储(对其签名或加密以避免伪造并为其添加时间戳)。
  • 精确度:凭据包括的不仅仅是用户名+密码。它们还包括用户权限列表。散列密码不足以避免伪造,因为如果“本地安全存储”未签名,用户可以简单地将新权限添加到自己的列表中。
  • 是的,我知道。 :) 查看我的更新。使用 sha-1 哈希保护整个存储真的很简单。
  • 再次感谢。实际上将有 2 个应用程序使用身份验证。一个用 Delphi 编写,一个用 Java 编写。这就是为什么我宁愿依赖标准库而不是自己实现一些东西的原因。如果找不到更好的东西,我会保留 ldif 解决方案。
【解决方案2】:

这是我决定使用的解决方案(我已经在对我的问题的编辑中对其进行了描述,但我希望能够接受“关闭”问题的答案):

由于我还没有找到其他解决方案,我决定使用 LDIF 导出,在文件开头添加时间戳作为注释,然后对文件进行签名。为了签署文件,我计算了文件的哈希值 (SHA-1) + 一个密钥。签名作为注释添加到文件的开头。为了检查签名,我删除了签名文件的第一行并重新计算了哈希值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 2020-08-28
    • 2019-03-15
    • 2016-02-11
    • 2016-11-23
    相关资源
    最近更新 更多