Истечение срока действия членства в ASP.NET
Я использую членство ASP.NET для аутентификации своего веб-приложения. Это отлично поработало для меня. Теперь я должен выполнить срок действия пароля.
Если срок действия пароля истек, пользователь должен быть перенаправлен на экран ChangePassword
и не должен быть разрешен доступ к какой-либо другой части приложения без изменения пароля.
Есть много страниц aspx. Одним из решений может быть перенаправление на экран ChangePassword
OnInit
для каждого aspx, если пароль истек. Есть ли другие решения или рекомендации.
Спасибо,
Jai
Ответы
Ответ 1
Кроме ответа 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");
}
}
}
Ответ 2
Вы можете добавить обработчик событий для события HttpApplication.PostAuthenticateRequest в global.asax и обработать перенаправление там.
Ответ 3
В дополнение к Andrew 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
Просто реализовано это примерно через час, нет необходимости изменять вашу базовую страницу. Вот что вы должны делать:
-
Отвечайте на событие LoggingIn
управления членством
-
Найдите пользователя в базе данных членства и получите LastPasswordChangedDate
-
Используя TimeSpan, сравните это с текущей датой и решите, был ли последний последний раз изменен больше, чем необходимое количество дней назад. Я получаю это значение от web.config
-
Если истек, перенаправляйтесь на экран ChangePassword
Ответ 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 для получения имен контроллера и действий в приведенном выше коде.
Отметьте все контроллеры этим атрибутом, кроме "AccountController
". При этом ни один пользователь с истекшим паролем не сможет просматривать сайт.
Вот сообщение, которое я сделал по этому вопросу с бонусами:
Атрибут фильтра User Password Expired в ASP.NET MVC
Ответ 6
Я использовал код сверху и лишь слегка модифицировал его для реализации в Asp.NET(4.5) MVC5 с помощью .NET Identity Provider. Просто оставив его здесь для следующего парня/девушки:)
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();
}
}