【问题标题】:Trying to change a password that "user must change" in AD through ASP.NET试图通过 ASP.NET 在 AD 中更改“用户必须更改”的密码
【发布时间】:2012-05-18 08:54:55
【问题描述】:

如果帐户没有勾选“下次登录时必须更改用户”,我可以更改密码。
但是,如果选中该框,当我尝试访问用户时会收到错误的密码错误。

LogOnUser() 返回正确的错误代码,因此我知道用户必须更改密码。
正如 Joe Kaplan 所说的 here(早在 2004 年),我无法绑定到用户以更改他们的密码。

无论是使用 AccountManagement/PrincipalContext 还是 DirectoryEntry/DirectorySearcher,都是同样的问题。

【问题讨论】:

    标签: asp.net active-directory passwords


    【解决方案1】:

    我在上一个职位的一个项目中这样做了。我们没有尝试使用他们自己的凭据绑定到用户,而是设置了一个仅具有更改密码权限的 AD 帐户。

    因此,一旦您收到指示用户必须更改密码的错误代码,请询问新密码,以管理员身份获取用户,然后进行更改。

    我记得,我们必须明确传递管理员用户名和密码才能使其工作,而不是依赖于运行代码的凭据。

    为了安全起见,我们将受限管理员用户名和密码的加密副本存储在注册表中,并在我们拨打电话时对其进行解密。

    代码将是这样的:

            PrincipalContext dc = new PrincipalContext(ContextType.Domain, 
                "www.yourdomain.com", "dc=yourdomain,dc=com", 
                ContextOptions.SimpleBind, "AdminUserName", "AdminPassword");
            UserPrincipal usr = UserPrincipal.FindByIdentity(dc, 
                "UserWhoNeedsPasswordChanged");
            usr.ChangePassword("oldPass", "newPass");
    

    【讨论】:

    • 在这里实现了同样的事情。研究并研究了一个解决方案,并自制了一些非常相似的东西。
    • 您是如何使用管理员凭据的?您是否冒充或是否有调用设置密码并传递凭据?
    • 在 PrincipalContext 对象的构造函数中,应该有一个包含用户名和密码的重载。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多