如何脱机使用LDAP凭据?

时间:2009-02-24 10:31:05

标签: authentication ldap kerberos ldif

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

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

我已经考虑过了:

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

    但这将是一个非常“沉重”和复杂的解决方案。此外,有丝分裂似乎尚未完成。

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

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

任何可以帮助我的其他想法或工具?

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

2 个答案:

答案 0 :(得分:5)

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

  1. 用户为您的应用提供(username + password)
  2. 应用程序尝试联系LDAP进行身份验证
    • 在线工作? (例如连接成功)
      1. 应用程序使用(username + password)对LDAP进行身份验证
        • 身份验证是否成功?
          1. 应用商店或更新 hash(password) (cached_credentials) (username)到本地安全存储空间
          2. 申请以经过身份验证 [[STOP]]
          3. 继续进行
        • 身份验证失败了?
          1. 应用程序以未经身份验证(不正确的凭据) [[STOP]]
          2. 继续进行
    • 离线工作? (例如网络错误)
      1. 应用程序尝试从本地安全存储中检索(cached_credentials) (username)
        • (cached_credentials)比[{1}}更新了AND
          1. 应用程序将(1 week)(cached_credentials)进行比较
            • 匹配
              1. 申请以经过身份验证 hash(password)
              2. 继续进行
            • 不匹配?
              1. 应用程序以未经身份验证(不正确的凭据) [[STOP]]
              2. 继续进行
        • [[STOP]]不存在(cached_credentials)不及OR
          1. 应用程序以未经身份验证(网络错误) (1 week)
          2. 继续进行
  3. 顺便说一句,这是(或者是IIRC)Windows NT +用于域控制器的用户身份验证的相同模型。登录后,将尝试对域控制器进行身份验证,并创建或更新用户配置文件的本地(缓存)版本。如果域控制器不可用,系统将提示用户继续对本地(缓存)配置文件中捕获的凭据进行身份验证(如果存在)。


    修改

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

答案 1 :(得分:1)

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

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