【问题标题】:ASP.NET membership password expirationASP.NET 成员密码过期
【发布时间】:2010-09-25 20:16:06
【问题描述】:

我正在使用 ASP.NET 成员身份验证我的 Web 应用程序。这对我很有用。我现在必须实现密码过期。

如果密码已过期,应将用户重定向到ChangePassword 屏幕,并且在不更改密码的情况下不应允许用户访问应用程序的任何其他部分。

有很多aspx页面。如果密码已过期,一种解决方案可能是重定向到每个 aspx 的ChangePassword 屏幕OnInit。有没有其他解决方案或建议。

谢谢, 贾伊

【问题讨论】:

    标签: asp.net authentication asp.net-membership change-password


    【解决方案1】:

    除了csgero's answer,我发现您不需要在 ASP.Net 2.0 (3.5) 中为该事件显式添加事件处理程序。

    您可以在global.asax 中简单地创建以下方法,它会为您连接起来:

    void Application_PostAuthenticateRequest(object sender, EventArgs e)
    {
        if (this.User.Identity.IsAuthenticated)
        {
            // get user
            MembershipUser user = Membership.GetUser();
    
            // has their password expired?
            if (user != null
                && user.LastPasswordChangedDate.Date.AddDays(90) < DateTime.Now.Date
                && !Request.Path.EndsWith("/Account/ChangePassword.aspx"))
            {
                Server.Transfer("~/ChangePassword.aspx");
            }
        }
    }
    

    【讨论】:

    • 请注意下面 Ben Rethmeier 的修复 (stackoverflow.com/a/9879682/324817),以便可以在更改密码屏幕上更改密码。
    • 谢谢@shrodes - 我已经更新了我的答案,包括 Ben Rethmeier 的修复:o)
    【解决方案2】:

    您可以在 global.asax 中为 HttpApplication.PostAuthenticateRequest 事件添加事件处理程序并在那里处理重定向。

    【讨论】:

    • 这就是我要做的,结合使用 Membership Provider 的 LastPasswordChangedDate 属性来确定它何时到期。
    【解决方案3】:

    除了Andrew's answer,我发现您需要检查用户是否已经在更改密码页面上,否则他们将永远无法真正更改密码,因此永远不要离开更改密码站点:

    void Application_PostAuthenticateRequest(object sender, EventArgs e)
        {
            if (this.User.Identity.IsAuthenticated)
            {
                // get user 
                MembershipUser user = Membership.GetUser();
    
                // has their password expired? 
                if (user != null
                    && user.LastPasswordChangedDate.AddMinutes(30) < DateTime.Now
                    && !Request.Path.EndsWith("/Account/ChangePassword.aspx"))
                {
                    Server.Transfer("~/Account/ChangePassword.aspx");
                }
            }
        } 
    

    【讨论】:

      【解决方案4】:

      大约一个小时就实现了这个,不需要修改你的基本页面。以下是你必须做的:

      1. 响应成员控制的LoggingIn事件

      2. 在会员数据库中找到用户,获取LastPasswordChangedDate

      3. 使用 TimeSpan,将其与当前日期进行比较,并确定上次更改密码的时间是否超过所需天数。我从 web.config 得到这个值

      4. 如果过期,重定向到ChangePassword屏幕

      【讨论】:

      • 这不会捕获拥有现有身份验证票的用户(“记住我”)。 csgero的解决方案是正确的。
      • 是的,如果它们当前已通过身份验证,我会说这不是一个大问题,除非您使您的 cookie 有效到无穷大。也许如果您检测到他们已经登录并过期,那么只需将 cookie 设置为每次在 20 分钟左右过期。然后,当他们回来时,他们将不得不改变它。
      • 检查 PostAuth 的问题还在于每个请求都会增加大量系统活动。只要您的票证经常过期,就不会有太大问题,或者您只需在超时时间之外运行 PostAuth 代码 +1 天。这可以确保任何使用有效表单身份验证票访问该站点的人都会得到检查。然后,如果他们在那段时间根本没有登录,表单身份验证票就会过期,甚至可以使用 LogginIn。超过票证过期时间 +1 天后,您可以删除 PostAuth 事件。您还需要在登录时检查
      • 并在他们的密码过期时强制他们的票在 MAX 时过期。这可以防止人们在令牌到期之前过期的情况。
      • 这不会捕获那些只是离开更改密码屏幕的用户。他们刚刚进行了身份验证,他们很高兴。这就是为什么您必须检查每个请求,尽管它并不优雅。
      【解决方案5】:

      我来这里是为了寻找解决方案,但我目前的技术是 ASP.NET MVC。所以为了帮助别人:你可以扩展AuthorizeAttribute,并覆盖OnAuthorization方法,像这样:

      public class ExpiredPasswordAttribute : AuthorizeAttribute
      {
          public override void OnAuthorization(AuthorizationContext filterContext)
          {
              IPrincipal user = filterContext.HttpContext.User;
      
              if(user != null && user.Identity.IsAuthenticated)
              {
                  MembershipUser membershipUser = Membership.GetUser();
      
                  if (PasswordExpired) // Your logic to check if password is expired...
                  {
                      filterContext.HttpContext.Response.Redirect(
                          string.Format("~/{0}/{1}?{2}", MVC.SGAccount.Name, MVC.SGAccount.ActionNames.ChangePassword,
                          "reason=expired"));
      
                  }
              }
      
              base.OnAuthorization(filterContext);
          }
      }
      

      注意:我使用T4MVC 来检索上面代码中的Controller 和Action 名称。

      用这个属性标记除“AccountController”之外的所有控制器。这样做,密码过期的用户将无法浏览该网站。

      这是我在该主题上发表的一篇文章,并获得了一些奖励:

      User Password Expired filter attribute in ASP.NET MVC

      【讨论】:

        【解决方案6】:

        我使用了上面的代码,只是稍微修改了它以使用 .NET 身份提供程序在 Asp.NET (4.5) MVC5 中实现。把它留在这里给下一个人/gal :)

        void Application_PostAuthenticateRequest(object sender, EventArgs e)
            {
                if (this.User.Identity.IsAuthenticated)
                {
                    WisewomanDBContext db = new WisewomanDBContext();
        
                    // get user
                    var userId = User.Identity.GetUserId();
                    ApplicationUser user = db.Users.Find(userId);
        
                    // has their password expired?
                    if (user != null && user.PasswordExpires <= DateTime.Now.Date
                        && !Request.Path.EndsWith("/Manage/ChangePassword"))
                    {
                        Response.Redirect("~/Manage/ChangePassword");
                    }
        
                    db.Dispose();
                }
            }
        

        【讨论】:

          猜你喜欢
          • 2011-11-21
          • 2011-05-04
          • 2013-11-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-08
          • 2020-04-12
          • 1970-01-01
          相关资源
          最近更新 更多