5

我想使用 LDAP 服务器(可能是Apache 目录)来管理应用程序的登录名和凭据。有时,应用程序需要离线工作(在笔记本电脑上),而无需连接到 LDAP 服务器。

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

我已经想过:

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

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

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

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

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

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

4

2 回答 2

5

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

  1. 用户为您的应用程序提供(username + password)
  2. 应用程序尝试联系LDAP以进行身份​​验证
    • 在线工作?(例如连接成功)
      1. 应用程序使用 LDAP 进行身份验证(username + password)
        • 认证成功?
          1. 应用程序存储或更新 hash(password)到本地安全存储(cached_credentials)(username)
          2. 应用程序进行身份验证 [[STOP]]
        • 认证失败?
          1. 应用程序以未经身份验证的方式进行(不正确的凭据)[[STOP]]
    • 离线工作?(例如网络错误)
      1. (cached_credentials)应用程序尝试(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。)您不需要加密它因为里面没有存储任何秘密信息。
于 2009-02-25T23:46:36.780 回答
1

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

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

于 2011-12-08T10:13:48.510 回答