23

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

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

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

谢谢,杰

4

6 回答 6

29

除了csgero 的回答之外,我发现您不需要在 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");
        }
    }
}
于 2011-07-15T09:29:36.030 回答
13

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

于 2008-12-08T14:17:29.427 回答
9

Andrew 的回答之后,我发现您需要检查用户是否已经在更改密码页面上,否则他们将永远无法真正更改密码,因此永远不会离开更改密码站点:

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");
            }
        }
    } 
于 2012-03-26T20:53:33.650 回答
6

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

  1. 响应LoggingIn成员控制事件

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

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

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

于 2009-07-24T13:59:32.743 回答
4

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

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”之外的所有控制器。这样做,密码过期的用户将无法浏览该网站。

这是我在该主题上发表的一篇文章,其中有一些加分:

ASP.NET MVC 中的用户密码过期过滤器属性

于 2012-05-23T20:44:02.187 回答
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();
        }
    }
于 2016-03-10T21:32:20.490 回答