Как потребовать от пользователя 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;