【问题标题】:setting passwordMustChange attribute to "on" in Sun-one LDAP doesn't have any expected effect在 Sun-one LDAP 中将 passwordMustChange 属性设置为“on”没有任何预期效果
【发布时间】:2015-03-11 09:45:29
【问题描述】:

我正在使用 JNDI 框架与专门针对 Sun one LDAP 的各种 LDAP 服务器进行交互,我观察到以下几点:

用例:如果管理员重置 Sun-One LDAP 服务器中任何用户的密码,则 passwordMustChange 属性设置为“on”。因此,用户必须在下次登录时更改他/她的密码。这是记录的内容。

我正在使用 JNDI 通过 JAVA 代码执行相同的操作。我观察到此属性已成功设置为“on”。所以编程逻辑是正确的。

但是当我在 LDAP 服务器上使用该用户登录时,它没有给出任何错误或弹出提示密码已过期,请更改密码。 对于 Active Directory (AD) 服务器,相同的用例按预期工作 如果是 AD,我们需要将 pwdLastSet 设置为 0。它工作正常,系统要求在下次登录时更改密码。

相反,相同的用例不适用于任何 LDAP 风格,例如 Sun-One LDAP、ADAM 或 Open LDAP。 请让我知道是否有人观察到此类问题并建议我如何解决此问题。

【问题讨论】:

  • 在 OpenLDAP 中为我工作。明天我会挖出我的代码。您是否使用密码策略扩展操作和请求/响应控件?
  • 你是说 OpenLDAP,你观察到了预期的行为吗?你用的是哪个参数? pwdReset 或 passwordMustChange ?是的。我正在使用密码策略扩展操作以及请求/响应控件。如果你能分享你的代码,那将有很大的帮助!
  • 在 OpenLDAP 中为我工作。我正在使用这两个属性。稍后编码。
  • 这里不能完全改变你的问题,从而使之前的所有答案和cmets,以及你的标题都变得毫无意义。如果你有一个新问题,问一个新问题。
  • 对此表示歉意。我想用新的查询继续同一个线程,但找不到这样做的方法,所以编辑了同一个问题

标签: ldap jndi


【解决方案1】:

您将其设置在错误的位置。 passwordMustChange 是策略的属性,而不是用户的。这意味着如果您为任何用户设置操作属性pwdReset,他必须在下次登录时更改密码,并且在他这样做时会通过响应控件来建议。

这意味着您在绑定用户时必须使用密码策略请求控件,并检查响应控件。也意味着在修改密码时必须使用change-password扩展操作,而不是仅仅重写属性。

这也解释了为什么您认为必须将objectClass=passwordPolicy 添加到用户条目中。你没有。您必须定义一个单独的策略对象,其中包含 passswordMustChange 的值和其他策略属性,并在配置中将其指定为默认策略,或者在用户条目中指定为他的特定策略(如果您要走那么远)。

需要重读documentation,明确区分策略属性和用户操作属性。它们分别列出。

您将什么代码用于扩展操作和请求/响应控件?我不得不写我的。几年前我在 Sun Java 论坛上发布过:是那个代码吗?只是好奇。

【讨论】:

  • 谢谢。抱歉,我们没有使用扩展操作。按照 JAVA 代码将 passwordMustChange 设置为 "on" BasicAttribute passwdMustChange = new BasicAttribute("passwordMustChange","on"); ModificationItem modItem = new ModificationItem(DirContext.REMOVE_ATTRIBUTE,passwdMustChange); ...然后使用 modifyAttributes() 更新相同的属性以及其他属性,例如 userPassword 您是说对于提到的用例,它是强制使用扩展操作和请求/响应控制吗?我找不到扩展操作的好例子
  • 我已经回答了每一个问题。如果你不这样做,它就行不通。您根本不需要编写代码来设置passwordMustChange:您可以使用LDAP 浏览器在策略条目中设置它,或者如果您将密码策略创建为.ldif,则可以设置ldapadd。这不是你要动态改变的东西。无需代码。
  • 我能够执行扩展操作并从 OpenLDAP 获取 PasswordResponseControl,但它不能按预期工作。我应该得到 NoPermissionException 但我没有收到任何错误,只是警告 timeBeforeExpiration = 84。其次,即使定义了默认密码策略,更改用户密码后我也看不到,pwdMustChange 设置为 TRUE。
【解决方案2】:

不幸的是,这种功能没有标准(有一个互联网草案,已过期,部分在不同的服务器上实现)。 根据您的 Sun Directory Server 版本,有不同的方法来执行此操作(SunDS 6.x 引入了基于 Internet 草案的新密码策略)。 在 5.x 中,我似乎记得密码过期时 passwordExpirationTime 将采用特定值。服务器将返回 Bind 响应的 PasswordExpired Control 部分,说明它已过期。

对于 6.x 及更高版本,pwdReset 操作属性设置为 true。如果您在 Bind 请求中设置了 PwdPolicyControl 请求,服务器将返回 PasswordExpired Control 或 PwdPolicyControl 响应。

【讨论】:

  • 感谢您的回复。我们希望为所有 LDAP 服务器实现,例如 OpenLDAP、Sun-One、ADAM 等。在 Open LDAP 的情况下,即使 pwdReset 设置为 true 也对我们不有效。对于 SunOne LDAP,我什至观察到如果帐户没有 ObjectClass = 密码策略,那么系统甚至不允许设置任何参数,即 passwordMustChange。最后,在 ADAM 的情况下,它甚至不允许我们设置 pwdLastSet = 0。如果 pwdLastSet 设置为“0”(字符串),则会引发以下错误
  • @BND 给用户加objectClass=passwordPolicy肯定是不对的。这是针对密码策略条目本身的,而不是针对用户的。您一定有其他配置问题。
  • 同意。 Sun Directory Server 将密码策略的定义与其强制执行的用户完全分开。在帐户中,您只能找到维护策略状态的操作属性(密码更改时间、到期、锁定状态、重置...)。
  • @LudovicPoitou Internet 草稿也是如此。它不仅限于 Sun DS。
  • @EJP,我知道,因为我的名字出现在 Internet Drafts 上 ;-) 并非所有服务器都实施了草案,最初是记录 Netscape / Sun / IPlanet 服务器中的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 1970-01-01
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多