Подтвердить что ты не робот

Истечение срока действия членства в ASP.NET

Я использую членство ASP.NET для аутентификации своего веб-приложения. Это отлично поработало для меня. Теперь я должен выполнить срок действия пароля.

Если срок действия пароля истек, пользователь должен быть перенаправлен на экран ChangePassword и не должен быть разрешен доступ к какой-либо другой части приложения без изменения пароля.

Есть много страниц aspx. Одним из решений может быть перенаправление на экран ChangePassword OnInit для каждого aspx, если пароль истек. Есть ли другие решения или рекомендации.

Спасибо, Jai

4b9b3361

Ответ 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();
        }
    }