el control y el establecimiento ChangePassword expresión regular para nueva contraseña
-
19-09-2019 - |
Pregunta
Esta parece que debería tener una solución sencilla pero me parece que no puede encontrarlo.
Estoy usando el control ChangePassword
en una aplicación ASP.NET 2.0, utilizando tanto el ChangePasswordTemplate
y SuccessTemplate
para definir un estilo personalizado. Los cuadros de texto tienen ID de la siguiente manera
contraseña actual del cuadro de texto ID = CurrentPassword
Nueva contraseña de cuadro de texto ID = contraseñaNueva
Confirmar nueva contraseña del cuadro de texto ID = ConfirmPassword
Por razones DRY
, quiero usar la expresión regular que se define en el proveedor de suscripciones personalizado para validar la nueva contraseña en el cliente. Por desgracia, el establecimiento de la propiedad del control de ChangedPassword
de la siguiente manera
ChangePassword.NewPasswordRegularExpression =
Membership.PasswordStrengthRegularExpression;
ChangePassword.NewPasswordRegularExpressionErrorMessage =
"Regex Error Message";
en Page_Init
establece la expresión con el valor esperado, pero no causa la validación del lado del cliente para suceder en la nueva contraseña (la página envía el texto y el fracaso de miembro ChangePassword
estándar se muestra).
Me vendría bien un RegularExpressionValidator
en el ChangePasswordTemplate
y establezca la propiedad ValidationExpression
a Membership.PasswordStrengthRegularExpression
pero la mejor manera que puedo ver para ello requiere de manera recursiva a través de los controles en la plantilla para encontrar el RegularExpressionValidator
y el establecimiento de la propiedad, lo que me hace creer que debe haber una forma más elegante. Tengo otros controles de validación en la plantilla (campos requeridos y un validador de comparar), en caso de que esto puede ser la causa de un conflicto con el uso de las propiedades de validación ChangePassword
.
Mi pregunta es, entonces, funciona ChangePassword
propiedad del control NewPasswordRegularExpression
cuando el uso de plantillas o tengo que ir por la vía del control RegularExpressionValidator
?
EDIT:
Se ofrece una recompensa por esto, ya que no puedo encontrar una respuesta definitiva de por qué la propiedad ChangePassword
del control NewPasswordRegularExpression
no valida el lado del cliente.
Solución
Si utiliza "Convertir a la plantilla", el control RegularExpressionValidator no se crea de forma automática y por lo tanto no vuelve a la última página. Esto se puede confirmar mediante la visualización de la fuente de la página antes y después de la conversión a la plantilla.
Para añadir un RegularExpressionValidator exactamente como la que ASP.NET utiliza sin la plantilla, definirlo entre el contraseñaNueva cuadro de texto y el RequiredFieldValidator como esto:
<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>
No se puede utilizar la propiedad NewPasswordRegularExpression del ChangePassword para cambiar la expresión regular en este punto. Vas a tener que hacer esto en su lugar:
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";
}
Espero que esto ayude.
Otros consejos
En este momento me tomó demasiado tiempo para volver.
PasswordStrengthRegularExpression se valida del lado del servidor. y NewPasswordRegularExpression validado en el lado del cliente. Y aquí está la diferencia. Debido al error en la validación JSScript / VSScript Regx, cada expresión regular que se validó en el servidor no será validado en browswer.
Además, la contraseña se consigue validado con NewPasswordRegularExpression así PasswordStrengthRegularExpression. Así NewPasswordRegularExpression no debe romper la regla definida en PasswordStrengthRegularExpression.
por ejemplo.
passwordStrengthRegularExpression="^*(?=.{7,})(?=(.*\W){1,})(?=(.*\d){1,})"
NewPasswordRegularExpression="^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\W).*$"
funciona bien.
Espero que esto le ayuda.
Actualizar : expresión regular de búsqueda hacia delante fallo.
http://blog.stevenlevithan.com/archives/regex-lookahead-bug