我正在使用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更改密码页面绑定,以便在用户成功更改其密码并取消选中其用户配置文件中的复选框后,我可以运行一些代码?
或者有更好的方法来实现这个目标吗?
谢谢, 科里
更新:添加我用来解决问题的代码。我使用了用户:更新事件,如Anton所示。我决定如果用户的密码在之前的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();
}
}
}
}
}
}
}
答案 0 :(得分:2)
在用户更改后应该触发一个事件(我相信更改密码会触发此事件):“user:updated”。在事件处理程序中,您将能够检查“LastPasswordChangedDate”用户属性并确定密码更改或其他更改用户操作。如果是密码更改,那么您可以取消选中用户个人资料中的复选框。
答案 1 :(得分:0)
首先创建一个自定义配置文件,在其中添加名为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网址。在此页面上,为旧密码和新密码以及提交按钮创建一个表单。
提交表单执行密码更改:
MembershipUser user = Membership.GetUser(username);
user.ChangePassword(oldPassword, newPassword);
user.Profile["isFirstTime"]=false;