Asp.net membership Sitecore强制密码更改
我需要实现这样一个特性。 它需要工作,以便在您上次更改密码的x天后,当您登录时收到一条消息,提示您的密码已过期,请输入新密码并确认新密码Asp.net membership Sitecore强制密码更改,asp.net-membership,sitecore,Asp.net Membership,Sitecore,我需要实现这样一个特性。 它需要工作,以便在您上次更改密码的x天后,当您登录时收到一条消息,提示您的密码已过期,请输入新密码并确认新密码 您是否有任何想法/建议如何以正确的方式进行此操作?您可以使用过程方法将您自己的处理器添加为登录管道的第一个处理器: 公共作废流程(日志记录args) { MembershipUser=Membership.GetUser(args.Username); 如果(用户!=null) { DateTime日期=user.LastPasswordChangedDate
您是否有任何想法/建议如何以正确的方式进行此操作?您可以使用
过程方法将您自己的处理器添加为登录
管道的第一个处理器:
公共作废流程(日志记录args)
{
MembershipUser=Membership.GetUser(args.Username);
如果(用户!=null)
{
DateTime日期=user.LastPasswordChangedDate;
if((DateTime.Now-date).TotalDays>maxDaysWithoutPasswordChange)
{
HttpContext.Current.Response.Redirect(“/passwordchangepage”);
}
}
}
这将把所有需要更改密码的用户重定向到/passwordchangepage
url。在此页面上,为旧密码和新密码创建表单
提交表单时,执行密码更改:
MembershipUser=Membership.GetUser(用户名);
user.ChangePassword(旧密码、新密码);
Sitecore的安全模型基于ASP.NET one,而ASP.NET one实际上也不具备此类功能。因此,这看起来更像是普通ASP.NET功能的自定义,实际上与Sitecore无关。但是,我可以为您提供一些关于如何实现这一点的建议
您可以为用户配置文件创建两个属性:一个属性为过期持续时间(或web.config中的设置),另一个属性为保存上次密码更新的日期。然后您应该稍微更改一下身份验证逻辑
首先,在对用户进行身份验证之前,您应该为登录表单上指定的用户检查新自定义字段的值。然后,如果密码过期,要求用户更改密码-将其重定向到包含3个字段的页面:“旧密码”、“新密码”和“确认新密码”
有了这3个值,您可以使用MemberhipUser类的适当方法更改用户密码。更改密码后,您可以对用户进行身份验证。我在最近的一个项目中使用post实现了相同的功能
它提供了所需代码的完整运行过程,以及如何创建配置文件来修补新的管道。还为密码重置页面和密码过期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;
}
}
公共类CheckPasswordExpiration
{
private TimeSpan TimeSpanToExpirePassword{get;set;}
私有字符串ChangePasswordPageUrl{get;set;}
公共作废流程(日志记录args)
{
Assert.ArgumentNotNull(args,args);
如果(!IsEnabled())
{
返回;
}
MembershipUser=GetMembershipUser(args);
如果(HasPasswordExpired(用户))
{
重定向(ChangePasswordPageUrl);
}
}
私人住宅已启用()
{
返回IsTimeSpanToExpirePasswordSet()&ischangepasswordpagerset();
}
私有bool IsTimeSpanToExpirePasswordSet()
{
返回TimeSpanToExpirePassword>默认值(TimeSpan);
}
私有bool IsChangePasswordPageUrlSet()
{
return!string.IsNullOrWhiteSpace(ChangePasswordPageUrl);
}
私有静态成员身份用户GetMembershipUser(LogginArgs args)
{
Assert.ArgumentNotNull(args,args);
Assert.ArgumentNotNullOrEmpty(args.Username,“args.Username”);
返回Membership.GetUser(args.Username,false);
}
private bool HasPasswordExpired(成员身份用户)
{
return user.LastPasswordChangedDate.Add(TimeSpanToExpirePassword)对于我的特殊情况,客户不想使用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");
}
}
}
受保护的无效应用程序\u PostAuthenticateRequest(对象发送方,事件参数e)
{
if(this.User.Identity.IsAuthenticated)
{
//在用户登录时获取该用户
MembershipUser=Membership.GetUser();
//如果用户不是空的
//并且密码过期日期小于密码策略过期日期
//并且用户没有直接调用更改密码页面
if(user!=null&&user.LastPasswordChangedDate.Date.AddDays(90)
一旦他们点击“更改密码”页面,我会检查他们是从登录页面还是从网站内部发送的。根据URL参考,我会显示相应的“您的密码即将过期”消息。您是在检查CMS用户还是网站用户?您好,我在检查CMS用户。