我使用ASP.NET成员资格来验证我的网络应用程序。这对我很有用。我现在必须实现密码过期。
如果密码已过期,则应将用户重定向到ChangePassword
屏幕,并且不允许在不更改密码的情况下访问应用程序的任何其他部分。
有很多aspx页面。如果密码已过期,一种解决方案可能是重定向到每个aspx的ChangePassword
屏幕OnInit
。有没有其他解决方案或建议。
谢谢, 洁
答案 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)
在大约一个小时内完成此操作,无需修改基页。继承人你要做的事情:
回应会员控制的LoggingIn
事件
在会员资格数据库中找到该用户并获取LastPasswordChangedDate
使用TimeSpan,将其与当前日期进行比较,并确定密码的最后更改时间是否超过必需天数。我从web.config
如果已过期,请重定向至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
”除外。这样做,没有密码过期的用户就可以浏览网站。
这是我在这个主题上做的一篇文章,有一些奖励积分:
答案 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();
}
}