我需要实现这样的功能。它需要在您上次更改密码后 x 天起作用,然后在您登录时收到一条消息,提示您的密码已过期,请输入新密码并确认新密码
你有什么想法/建议如何以正确的方式做到这一点?
我需要实现这样的功能。它需要在您上次更改密码后 x 天起作用,然后在您登录时收到一条消息,提示您的密码已过期,请输入新密码并确认新密码
你有什么想法/建议如何以正确的方式做到这一点?
您可以使用以下方法添加自己的处理器作为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
url。在此页面上为旧密码和新密码创建一个表格。
在提交表单时执行密码更改:
MembershipUser user = Membership.GetUser(username);
user.ChangePassword(oldPassword, newPassword);
我使用这篇文章在最近的一个项目中实现了相同的功能。
它让您全面了解所需的代码以及如何创建配置文件来修补新的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;
}
}
对于我的特殊情况,客户不想使用 sitecore 密码重置工具。我为我的 sitecore 网站创建了一个视觉工作室解决方案,并制作了一个品牌更改密码页面。获得该页面后,我将以下内容放在我的 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 引用者,我显示了相应的“您的密码将很快过期”消息。
Sitecore 的安全模型是基于 ASP.NET 的,它实际上也没有这样的功能。所以这看起来更像是对通用 ASP.NET 功能的自定义,实际上与 Sitecore 无关。但是,我可以为您提供一些关于如何实现这一点的建议。
您可以为用户配置文件创建 2 个属性:一个属性用于过期持续时间(或 web.config 中的设置),另一个用于保留上次密码更新的日期。然后你应该稍微改变你的身份验证逻辑。
首先,在用户通过身份验证之前,您应该检查登录表单上指定的用户的新自定义字段的值。然后,如果密码过期,请用户更改它 - 将他重定向到包含 3 个字段的某种表单的页面:“旧密码”、“新密码”和“确认新密码”。
拥有这 3 个值,您可以使用 MembershipUser 类的适当方法更改用户密码。更改密码后,您可以验证用户。