如何要求Sitecore用户在下次登录时更改密码?
我正在使用Sitecore 7.5构建一个系统,我想找出一种方法,要求Sitecore用户在下次登录时更改密码。我们有一个所有用户都拥有的自定义配置文件,我添加了一个名为“需要更改密码”的复选框。我将下面的代码添加到LoggingIn管道中。这样,当用户尝试登录时,我可以将他们重定向到内置的Sitecore更改密码页面如何要求Sitecore用户在下次登录时更改密码?,sitecore,sitecore7.5,Sitecore,Sitecore7.5,我正在使用Sitecore 7.5构建一个系统,我想找出一种方法,要求Sitecore用户在下次登录时更改密码。我们有一个所有用户都拥有的自定义配置文件,我添加了一个名为“需要更改密码”的复选框。我将下面的代码添加到LoggingIn管道中。这样,当用户尝试登录时,我可以将他们重定向到内置的Sitecore更改密码页面 public class PasswordChange { public void Process(LoggingInArgs args) { v
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更改密码页面,以便在用户成功更改其密码并取消选中其用户配置文件中的复选框后,我可以运行一些代码
还是有更好的方法来实现这一点
谢谢,
科里
更新:添加我用来解决问题的代码。我使用了下面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();
}
}
}
}
}
}
}
公共类UserUpdatedHandler
{
受保护的void HandleUserUpdate(对象发送方、事件args args)
{
var user=(MembershipUserWrapper)Event.ExtractParameter(args,0);
如果(用户!=null)
{
//如果此更改是密码更改,并且选中了“需要更改密码”复选框,
//然后取消选中“需要更改密码”复选框
//首先获取成员资格用户对象
var membershipUser=Membership.GetUser(user.UserName);
if(membershipUser!=null)
{
//现在检查自上次密码更改以来经过的时间
var elapsedTimeSinceLastPasswordChange=DateTime.Now-membershipUser.LastPasswordChangedDate;
如果(ElapsedTimesincellastPasswordChange.TotalSeconds<30)
{
//获取Sitecore用户
var sitecoreUser=User.FromName(User.UserName,true);
如果(sitecoreUser!=null)
{
//创建自定义用户
var customUser=new customUser(sitecoreUser.Profile);
如果(customUser.PasswordChangeRequired)
{
customUser.PasswordChangeRequired=false;
customUser.Save();
}
}
}
}
}
}
}
用户更改后应该触发一个事件(我相信更改密码会触发此事件):“用户:已更新”。在事件处理程序中,您将能够检查“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;
是的,我在网上的其他地方看到了这篇文章。我希望避免建立自己的密码更改页面。我希望我可以使用已经存在的内置Sitecore密码更改页面。这很有效!谢谢我将用我用来解决这个问题的代码更新这个问题。