Как заставить пользователя сменить пароль после первого входа? - PullRequest
10 голосов
/ 12 марта 2011

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

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

    Я игнорировал перенаправление, если Page - это страница ChagePassword с главной страницы, и я нашел этот ответ, который говорит:

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

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

Ответы [ 9 ]

5 голосов
/ 20 мая 2012

Вот вам, полностью протестированное решение;)

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
        }
    }
}
1 голос
/ 23 марта 2011

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

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

1 голос
/ 12 марта 2011

Вы можете сделать это в файле 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;
        }
    }
}
0 голосов
/ 24 января 2012

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

0 голосов
/ 05 апреля 2011

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

0 голосов
/ 01 апреля 2011

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

0 голосов
/ 18 марта 2011

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

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

0 голосов
/ 17 марта 2011

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

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

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

0 голосов
/ 12 марта 2011

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

• Вход в систему • Вход в систему

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

...