ASP.NET成员资格密码到期

时间:2008-12-08 11:52:34

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

我使用ASP.NET成员资格来验证我的网络应用程序。这对我很有用。我现在必须实现密码过期。

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

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

谢谢, 洁

6 个答案:

答案 0 :(得分:27)

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

答案 1 :(得分:13)

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

答案 2 :(得分:9)

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

答案 3 :(得分:6)

在大约一个小时内完成此操作,无需修改基页。继承人你要做的事情:

  1. 回应会员控制的LoggingIn事件

  2. 在会员资格数据库中找到该用户并获取LastPasswordChangedDate

  3. 使用TimeSpan,将其与当前日期进行比较,并确定密码的最后更改时间是否超过必需天数。我从web.config

  4. 获得此值
  5. 如果已过期,请重定向至ChangePassword屏幕

答案 4 :(得分:4)

我到这里寻找解决方案,但我目前的技术是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

答案 5 :(得分:0)

我使用上面的代码并稍微修改它以使用.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();
        }
    }