Как заставить пользователя изменить свой пароль после первого входа?

Я хочу заставить пользователя сменить пароль после его первого входа. Теперь, где я должен поместить код перенаправления на страницу ChangePassword?

  • Если я поместил его на страницу Page_Load по умолчанию, пользователь может перейти на любую страницу, потому что он является аутентифицированным.
  • Если я разместил его на странице Page_Load главной страницы, страница ChangePassword будет использовать одну и ту же главную страницу, и она войдет в бесконечный цикл перенаправления.

    Хотя я игнорирую перенаправление, если Page является страницей ChagePassword с главной страницы, и я нашел этот ответ, в котором говорится:

    Это звучит как плохая идея для начала. Идея мастера заключается в том, что ему все равно, какая страница есть, так как это общий код для каждой страницы.

Любое предложение!

Ответ 1

Здесь вы, полностью протестированное решение;)

protected void LoginButton_Click(object sender, EventArgs e)
{
    /****note: UserName and Password are textbox fields****/

    if (Membership.ValidateUser(UserName.Text, Password.Text))
    {
        MembershipUser user = Membership.GetUser(UserName.Text);
        if (user == null)
        {
           FailureText.Text = "Invalid username. Please try again.";
           return;
        }
        if (user.IsLockedOut)
           user.UnlockUser();

        /* this is the interesting part for you */
        if (user.LastPasswordChangedDate == user.CreationDate) //if true, that means user never changed their password before
        {
            //TODO: add your change password logic here
        }
    }
}

Ответ 2

Вы можете сделать это в файле GLobal.asax.

Убедитесь, что пользователь вошел в систему и запросил URL-адрес, а не ChangePassword, а затем перенаправил страницу смены пароля.

/// <summary>
/// this event occurs just after user is authenticated
/// </summary>
void Application_AuthorizeRequest(object sender, EventArgs e)
{
    // check if user is authenticated
    if (User.Identity.IsAuthenticated)
    {
        // checking page extension
        switch (System.IO.Path.GetExtension(Context.Request.Url.AbsoluteUri.ToLower()))
        {
            case ".bmp":
            case ".gif":
            case ".jpg":
            case ".jpe":
            case ".jpeg":
            case ".png":
            case ".css":
            case ".js":
            case ".txt":
            case ".swf":
                // don't redirect, these requests may required in many cases
                break;
            default:
                // checking if request is not for ChangePassword.aspx page
                if (!Context.Request.Url.AbsoluteUri.ToLower().Contains("/changepassword.aspx"))
                {
                    Context.Response.Redirect("~/ChangePassword.aspx");
                }
                break;
        }
    }
}

Ответ 3

У нас было приложение с аналогичными требованиями. Мы расширили базовый провайдер членства ASP.NET, чтобы проверить проверку LastPasswordChangedDate и сравнить его с CreateDate. Если это равно, это означает, что пользователь никогда не менял свой пароль и был перенаправлен на страницу входа.

Я вижу, что вы хотите иметь какой-то чек, чтобы продолжать прослушивать их даже после входа в систему. Я думаю, вы можете это сделать в AuthorizationRequest Global.asax. Это может быть дорого, хотя.

Ответ 4

Вы можете обрабатывать следующие события в элементе управления Login,

• LoggedIn • LoggingIn

Удачи, надеюсь, это поможет.

Ответ 5

как я понимаю, вы должны поместить код проверки в "Page_PreRender"

protected void Page_PreRender(object sender, EventArgs e)
{
     //Validation Code       
}

это событие запустит код до того, как страница отобразит что-либо

Ответ 6

Какой объект вы помещаете в раздел, чтобы оценить, аутентифицирован ли пользователь? Я бы просто установил логическое свойство с именем "ChangePasswordOnNextLoggin", а затем, если его true, я перенаправляюсь на "ChangePassword.aspx", вы можете поместить его туда, где хотите (даже на главной странице, поскольку вы только перенаправляете, если это свойство истинно, избегая бесконечный цикл).

Но лично я бы сделал оболочку для объекта PAGE, чтобы каждый .aspx-код за классом наследовал, тогда я бы наследовал эту оболочку, а на обертке ctor я бы добавил метод Authenticate для события Load в таком это был бы первый метод, который будет вызываться при загрузке любой страницы. Если я это сделаю, я смогу избежать установки кода проверки на MasterPage и кода, сделав код более чистым. Ты понял?

Ответ 7

Вместо кода, в котором пользователь аутентифицирован.

Ответ 8

Поскольку вы хотите, чтобы пользователь изменил свой пароль при первом входе в систему, после регистрации вы просто создаете еще одно поле в таблице входа в базу данных, которое будет иметь значение статуса, было ли выполнено начальное изменение пароля. Поэтому, когда пользователь регистрируется в первый раз, это значение проверяется и, если оно что-то вроде "без изменений", перенаправляет пользователя со страницы входа на страницу смены пароля. После успешного изменения пароля обновите поле.

Ответ 9

В SQL Server 2005 (плюс VS2008), помимо всех подходов "добавить еще один", мне гораздо проще выполнить базу данных безопасности asp.net, встроенную в хранимую процедуру aspnet_Membership_FindUsersByName. Он возвращает набор данных со всей информацией, которую вам когда-либо понадобится, включая последнюю дату активности, дату последнего изменения пароля, дату последнего входа и т.д. Со значениями времени.