我需要实现这样的功能。 它需要工作,以便在您上次更改密码后x天,然后当您登录时收到一条消息,说明您的密码已过期,请输入新密码并确认新密码
您是否有任何想法/建议如何以正确的方式做到这一点?
答案 0 :(得分:5)
您可以使用loggingin
方法将自己的处理器添加为Process
管道的第一个处理器:
public void Process(LoggingInArgs args)
{
MembershipUser user = Membership.GetUser(args.Username);
if (user != null)
{
DateTime date = user.LastPasswordChangedDate;
if ((DateTime.Now - date).TotalDays > maxDaysWithoutPasswordChange)
{
HttpContext.Current.Response.Redirect("/passwordchangepage");
}
}
}
这会将需要更改密码的所有用户重定向到/passwordchangepage
网址。在此页面上创建旧密码和新密码的表单。
提交表单执行密码更改:
MembershipUser user = Membership.GetUser(username);
user.ChangePassword(oldPassword, newPassword);
答案 1 :(得分:3)
我使用this帖子在最近的项目中实现了相同的功能。
它为您提供了所需代码的完整运行以及如何创建配置文件以修补新的Pipeline
。还会为密码重置页面和x天过期密码创建参数。
public class CheckPasswordExpiration
{
private TimeSpan TimeSpanToExpirePassword { get; set; }
private string ChangePasswordPageUrl { get; set; }
public void Process(LoggingInArgs args)
{
Assert.ArgumentNotNull(args, "args");
if (!IsEnabled())
{
return;
}
MembershipUser user = GetMembershipUser(args);
if (HasPasswordExpired(user))
{
WebUtil.Redirect(ChangePasswordPageUrl);
}
}
private bool IsEnabled()
{
return IsTimeSpanToExpirePasswordSet() && IsChangePasswordPageUrlSet();
}
private bool IsTimeSpanToExpirePasswordSet()
{
return TimeSpanToExpirePassword > default(TimeSpan);
}
private bool IsChangePasswordPageUrlSet()
{
return !string.IsNullOrWhiteSpace(ChangePasswordPageUrl);
}
private static MembershipUser GetMembershipUser(LoggingInArgs args)
{
Assert.ArgumentNotNull(args, "args");
Assert.ArgumentNotNullOrEmpty(args.Username, "args.Username");
return Membership.GetUser(args.Username, false);
}
private bool HasPasswordExpired(MembershipUser user)
{
return user.LastPasswordChangedDate.Add(TimeSpanToExpirePassword) <= DateTime.Now;
}
}
答案 2 :(得分:1)
对于我的特殊情况,客户不想使用sitecore密码重置工具。我创建了一个我的sitecore网站的visual studio解决方案,并制作了一个品牌更改密码页面。有了这个页面后,我将以下内容放在VS解决方案的Global.asax中。
protected void Application_PostAuthenticateRequest(object sender, EventArgs e)
{
if (this.User.Identity.IsAuthenticated)
{
// Get the user as they log in
MembershipUser user = Membership.GetUser();
// if the user is not blank
// and the password expiry date is less than the password policy expiration date
// and the user is not directly calling the change password page
if (user != null && user.LastPasswordChangedDate.Date.AddDays(90) < DateTime.Now.Date && !Request.Path.EndsWith("/layouts/changepw.aspx"))
{
// Then transfer to the change password page
Server.Transfer("~/layouts/changepw.aspx");
}
}
}
一旦他们点击更改密码页面,我就会检查他们是从登录页面还是从网站内发送的。根据URL引荐来源,我显示了相应的“您的密码即将过期”消息。
答案 3 :(得分:0)
Sitecore的安全模型基于ASP.NET,它实际上也没有这样的功能。所以这看起来更像是常见ASP.NET功能的自定义,实际上与Sitecore无关。但是,我可以就如何实现这一点向您提供一些建议。
您可以为用户个人资料创建2个属性:一个属性到期时间(或在web.config中设置),另一个属性用于保留上次密码更新的日期。然后你应该稍微改变你的认证逻辑。
首先,在对用户进行身份验证之前,您应该检查登录表单上指定的用户的新自定义字段的值。然后,如果密码已过期,请让用户进行更改 - 将其重定向到包含3个字段的页面:“旧密码”,“新密码”和“确认新密码”。
拥有这3个值后,您可以使用MemberhipUser类的适当方法更改用户密码。更改密码后,您可以对用户进行身份验证。