5

我需要实现这样的功能。它需要在您上次更改密码后 x 天起作用,然后在您登录时收到一条消息,提示您的密码已过期,请输入新密码并确认新密码

你有什么想法/建议如何以正确的方式做到这一点?

4

4 回答 4

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");
        }
    }
}

这会将所有需要更改密码的用户重定向到/passwordchangepageurl。在此页面上为旧密码和新密码创建一个表格。

在提交表单时执行密码更改:

MembershipUser user = Membership.GetUser(username);
user.ChangePassword(oldPassword, newPassword);
于 2013-08-28T12:16:54.687 回答
3

我使用这篇文章在最近的一个项目中实现了相同的功能。

它让您全面了解所需的代码以及如何创建配置文件来修补新的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;
        }
    }
于 2013-09-25T15:50:43.527 回答
1

对于我的特殊情况,客户不想使用 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 引用者,我显示了相应的“您的密码将很快过期”消息。

于 2014-10-16T18:32:24.123 回答
0

Sitecore 的安全模型是基于 ASP.NET 的,它实际上也没有这样的功能。所以这看起来更像是对通用 ASP.NET 功能的自定义,实际上与 Sitecore 无关。但是,我可以为您提供一些关于如何实现这一点的建议。

您可以为用户配置文件创建 2 个属性:一个属性用于过期持续时间(或 web.config 中的设置),另一个用于保留上次密码更新的日期。然后你应该稍微改变你的身份验证逻辑。

首先,在用户通过身份验证之前,您应该检查登录表单上指定的用户的新自定义字段的值。然后,如果密码过期,请用户更改它 - 将他重定向到包含 3 个字段的某种表单的页面:“旧密码”、“新密码”和“确认新密码”。

拥有这 3 个值,您可以使用 MembershipUser 类的适当方法更改用户密码。更改密码后,您可以验证用户。

于 2013-08-28T12:31:59.747 回答