Управление ChangePassword и установка регулярного выражения для нового пароля - PullRequest
1 голос
/ 13 ноября 2009

Кажется, у него должно быть простое решение, но я не могу его найти.

Я использую элемент управления ChangePassword в приложении ASP.NET 2.0, используя ChangePasswordTemplate и SuccessTemplate для определения пользовательского стиля. Текстовые поля имеют следующие идентификаторы

Идентификатор текстового поля текущего пароля = Текущий пароль
Идентификатор текстового поля нового пароля = Новый пароль
Подтвердите новый текстовый идентификатор пароля = ConfirmPassword

По причинам DRY я хочу использовать регулярное выражение, определенное в провайдере нестандартного членства, для проверки правильности нового пароля на стороне клиента. К сожалению, установка свойства элемента управления ChangedPassword выглядит следующим образом

ChangePassword.NewPasswordRegularExpression = 
    Membership.PasswordStrengthRegularExpression;
ChangePassword.NewPasswordRegularExpressionErrorMessage = 
    "Regex Error Message";

в Page_Init устанавливает выражение в ожидаемое значение, но не вызывает проверку на стороне клиента нового пароля (страница отправляется обратно и отображается стандартный текст ошибки * Membership ChangePassword).

Я мог бы использовать RegularExpressionValidator в ChangePasswordTemplate и установить для свойства ValidationExpression значение Membership.PasswordStrengthRegularExpression, но лучший способ, которым я могу это сделать, - это повторение через элементы управления в шаблоне для поиска RegularExpressionValidator и установка свойства, что заставляет меня поверить, что должен быть более элегантный способ. У меня есть другие элементы управления валидатора в шаблоне (обязательные поля и валидатор сравнения), на случай, если это может вызвать конфликт с использованием ChangePassword свойств валидации.

Мой вопрос: работает ли свойство NewPasswordRegularExpression элемента управления ChangePassword при использовании шаблонов или мне нужно перейти по маршруту управления RegularExpressionValidator?

EDIT:

Предложил вознаграждение за это, поскольку я не могу найти однозначного ответа о том, почему свойство NewPasswordRegularExpression элемента управления ChangePassword не проверяет клиентскую сторону.

Ответы [ 2 ]

2 голосов
/ 25 ноября 2009

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

Чтобы добавить RegularExpressionValidator точно так же, как тот, который ASP.NET использует без шаблона, определите его между NewPassword TextBox и RequiredFieldValidator следующим образом:

<asp:TextBox ID="NewPassword" runat="server" TextMode="Password"></asp:TextBox>

<asp:RegularExpressionValidator ID="NewPasswordRegExp" runat="server"
    ErrorMessage="RegularExpressionValidator" Display="Dynamic"
    ControlToValidate="NewPassword" ValidationGroup="ChangePassword1"></asp:RegularExpressionValidator>

<asp:RequiredFieldValidator ID="NewPasswordRequired" runat="server" 
    ControlToValidate="NewPassword" ErrorMessage="New Password is required." 
    ToolTip="New Password is required." ValidationGroup="ChangePassword1">*</asp:RequiredFieldValidator>

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

protected void Page_Init(object sender, EventArgs e)
{
    RegularExpressionValidator validator
        = ((RegularExpressionValidator)(ChangePassword1.Controls[0].FindControl("NewPasswordRegExp")));

    validator.ValidationExpression = Membership.PasswordStrengthRegularExpression;
    validator.ErrorMessage = "Regex Error Message";
}

Надеюсь, это поможет.

0 голосов
/ 13 ноября 2009

Извините, мне понадобилось слишком много времени, чтобы вернуться.

PasswordStrengthRegularExpression проверяется на стороне сервера. и NewPasswordRegularExpression проверено на стороне клиента. И здесь есть разница. Из-за ошибки в валидации JSScript / VSScript Regx каждое регулярное выражение, которое проверяется на сервере, не будет проверяться в браузере.

Кроме того, пароль проверяется с помощью NewPasswordRegularExpression, а также PasswordStrengthRegularExpression. Поэтому NewPasswordRegularExpression не должно нарушать правило, определенное в PasswordStrengthRegularExpression.

например.

passwordStrengthRegularExpression="^*(?=.{7,})(?=(.*\W){1,})(?=(.*\d){1,})"
NewPasswordRegularExpression="^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\W).*$"

отлично работает.

Надеюсь, это поможет вам.

Обновление : ошибка просмотра регулярных выражений.
http://blog.stevenlevithan.com/archives/regex-lookahead-bug

...