Как потребовать от пользователя Sitecore сменить пароль при следующем входе в систему?

Я строю систему с использованием Sitecore 7.5, и я хотел бы найти способ потребовать от пользователя Sitecore изменить свой пароль при следующем входе в систему. У нас есть пользовательский профиль, который есть у всех пользователей, и я добавил флажок "Требуется изменение пароля". И я добавил приведенный ниже код в конвейер 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 для изменения вашего пароля. Однако я не могу понять, когда я могу снять этот флажок в их профиле пользователя. В идеале я хотел бы иметь код, который запускается после того, как пользователь закончил менять свой пароль. Этот код должен снять флажок, чтобы при следующем входе в систему им не приходилось менять свой пароль.

Кто-нибудь знает, возможно ли каким-либо образом подключиться к встроенной странице смены пароля Sitecore, чтобы можно было запустить какой-то код после того, как пользователь успешно сменит свой пароль, и снимите этот флажок в своем профиле пользователя?

Или есть лучший способ сделать это?

Спасибо Кори

ОБНОВЛЕНИЕ: добавление кода, который я использовал для решения проблемы. Я использовал событие 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();
                        }
                    }
                }
            }
        }
    }
}

2 ответа

Решение

Есть событие, которое должно сработать после смены пользователя (я полагаю, что изменение пароля вызовет это событие): "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");
    }
  }
}

Это перенаправит всех пользователей, которым требуется изменение пароля, на URL-адрес страницы /passwordchange. На этой странице создайте форму для старого пароля и нового пароля и кнопку отправки.

При отправке формы выполните смену пароля:

MembershipUser user = Membership.GetUser(username);
user.ChangePassword(oldPassword, newPassword);
user.Profile["isFirstTime"]=false;
Другие вопросы по тегам