Как заставить пользователя изменить свой пароль после первого входа?
Я хочу заставить пользователя сменить пароль после его первого входа. Теперь, где я должен поместить код перенаправления на страницу 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
. Он возвращает набор данных со всей информацией, которую вам когда-либо понадобится, включая последнюю дату активности, дату последнего изменения пароля, дату последнего входа и т.д. Со значениями времени.