如何要求 Sitecore 用户在下次登录时更改密码?

How to require Sitecore user to change password on next login?

我正在使用 Sitecore 7.5 构建一个系统,我想找出一种方法来要求 Sitecore 用户在下次登录时更改密码。我们有一个所有用户都有的自定义配置文件,我添加了一个名为 "Password Change Required" 的复选框。我将下面的代码添加到 LoggingIn 管道中。这样,当用户尝试登录时,我可以将他们重定向到内置的 Sitecore 更改密码页面。

public class PasswordChange
{
    public void Process(LoggingInArgs args)
    {
        var user = Sitecore.Security.Accounts.User.FromName(args.Username, true);
        var myCustomUser = new CustomUser(user.Profile);
        if (myCustomUser.PasswordChangeRequired)
        {
            HttpContext.Current.Response.Redirect("/sitecore/login/changepassword.aspx");
        }
    }
}

效果很好。如果我进入用户管理器并选中给定用户的复选框,那么下次他们尝试登录时,他们将被重定向到内置的 Sitecore 页面以更改密码。但是我似乎不知道什么时候可以在他们的用户配置文件中取消选中该复选框。理想情况下,我希望在用户完成更改密码后得到 运行s 的代码。该代码应取消选中该复选框,以便他们下次登录时不需要更改密码。

有谁知道是否有可能以某种方式连接到内置的 Sitecore 更改密码页面,以便在用户成功更改密码并取消选中用户的复选框后,我可以获得一些代码 运行个人资料?

或者有更好的方法来完成这个吗?

谢谢, 科里

更新:添加我用来解决问题的代码。我按照下面 Anton 的建议使用了 user:updated 事件。我决定,如果用户的密码在之前的 30 秒内被更改,那么这意味着可以取消选中该复选框。

public class UserUpdatedHandler
{
    protected void HandleUserUpdate(object sender, EventArgs args)
    {
        var user = (MembershipUserWrapper)Event.ExtractParameter(args, 0);
        if (user != null)
        {
            // If this change was a password change and the Password Change Required checkbox is checked, 
            // then uncheck the Password Change Required checkbox

            //First get a membership user object
            var membershipUser = Membership.GetUser(user.UserName);
            if (membershipUser != null)
            {
                //Now check the elapsed time since the last password change
                var elapsedTimeSinceLastPasswordChange = DateTime.Now - membershipUser.LastPasswordChangedDate;
                if (elapsedTimeSinceLastPasswordChange.TotalSeconds < 30)
                {
                    //Get a Sitecore User
                    var sitecoreUser = User.FromName(user.UserName, true);
                    if (sitecoreUser != null)
                    {
                        //Create a custom user
                        var customUser = new CustomUser(sitecoreUser.Profile);
                        if (customUser.PasswordChangeRequired)
                        {
                            customUser.PasswordChangeRequired = false;
                            customUser.Save();
                        }
                    }
                }
            }
        }
    }
}

有一个事件应该在用户更改后触发(我相信更改密码会触发此事件):"user:updated"。在事件处理程序中,您将能够检查 "LastPasswordChangedDate" 用户 属性 并确定是密码更改还是其他更改用户操作。如果是更改密码,那么您可以在用户配置文件中取消选中该复选框。

第一步创建一个自定义配置文件,在其中添加一个名为 isFirstTime 的 属性。

您将自己的处理器添加为登录管道的第一个处理器:

public void Process(LoggingInArgs args)
{
MembershipUser user = Membership.GetUser(args.Username);
if (user != null)
  {
     if (user.Profile["isFirstTime"].Equals("1"))
    {
        HttpContext.Current.Response.Redirect("/passwordchangepage");
    }
  }
}

这会将所有需要更改密码的用户重定向到 /passwordchangepage url。在此页面上创建一个用于旧密码和新密码的表单以及一个提交按钮。

提交表单时执行密码更改:

MembershipUser user = Membership.GetUser(username);
user.ChangePassword(oldPassword, newPassword);
user.Profile["isFirstTime"]=false;