【问题标题】:Forgot Password忘记密码
【发布时间】:2012-07-25 12:17:48
【问题描述】:

我正在尝试创建一个 Web 应用程序,以使用 System.Web.Security API 根据问题/答案重置密码。

我得到一个例外:

DirectoryServicesCOMException (0x8007202f):违反约束 发生”,如果用户对问题提供了一个错误的答案。

如果我将attributeMapFailedPasswordAnswerCount 的值重置为未设置,则帐户将再次处于活动状态。

AD 中的帐户锁定阈值设置为 20 次登录尝试。

我是 AD 知识的新手,如果有人能指导我如何解决这个问题,我将不胜感激。

谢谢。

【问题讨论】:

  • 基于安全问题重置 AD 密码的 Web 服务?听起来真是个坏主意……无论如何,如果没有代码,异常就没有用了。如果您发布引发此异常的代码,则更有可能有人可以帮助您。
  • 感谢您给我关于潜在安全警告的建议。我计划将其扩展到手机并通过私人电子邮件发送密码重置。但现在我必须展示这个网络服务。
  • 问题是当属性映射到attributeMapFailedPasswordAnswerCount这个字段被设置时,AD的所有功能都会抛出异常,包括登录、更改密码或更改安全问题/答案。

标签: c# asp.net active-directory forgot-password


【解决方案1】:

我猜你正在使用 ASP.NET?我真的没有任何经验,一般来说我对 .NET 也没有太多经验(我仍在学习自己),但这是一个非常有用的链接,提供了各种 Active Directory API 的示例(link) .包括重置用户密码。这是 DirectoryEntry 类的链接,如果您不确定如何设置它 (link)。另外,浏览namespace documentation 非常非常有帮助(link)。可能我唯一喜欢 Microsoft 的就是他们出色的文档。

我通常会这样做(在 IronPython 中,因此它不会直接转换为您可以使用的代码):

ou = System.DirectoryServices.DirectoryEntry("LDAP://ou=Users,dc=whatever,dc=something,dc=localetc")
search = System.DirectoryServices.DirectorySearcher(ou, "(samAccountName="+acc"+")", Array[str](["distinguishedName"]]))
result = search.FindAll() # note 1
if result.Count != 1:
    raise BadError
else:
    ent = System.DirectoryServices.DirectoryEntry(result[0].Properties["distinguishedName"][0])
    ent.Username = admin # note 2
    ent.Password = pwd
    ent.Invoke("SetPassword", Array[object](["newpassword!"]))
    ent.Properties["LockOutTime"].Value = 0
    ent.CommitChanges()

注意事项:

  1. 如果这会返回多个结果,您就会遇到问题。

  2. 仅当运行此功能的帐户无权更改用户时才需要此功能和密码。我在一个非私有帐户上运行这些,所以我必须在脚本中包含我的管理员凭据(不用担心,它们不是硬编码的)

哦,您的帐户锁定阈值相当高。我会建议 3-5,这取决于您的用户的能力。

【讨论】:

  • 感谢您帮助我回答问题,我能够弄清楚更多细节。添加一些对我有帮助的东西是。我用来映射到属性的变量,其中一些是系统变量,无法使用。希望这可能对某人有用。我检查的第二件事是我搜索了本地安全策略并查看了帐户策略和帐户锁定策略。它应该为所有三个变量定义了值。无论如何,感谢您的帮助并在答案中付出了如此多的努力,我真的很感激。
  • 没问题。如果您有时间,请阅读此page(它列出了所有属性及其可用性)