il controllo e l'impostazione ChangePassword espressione regolare per la nuova password
-
19-09-2019 - |
Domanda
Questo sembra che dovrebbe avere una soluzione semplice, ma io non riesco a trovarlo.
Sto utilizzando il controllo ChangePassword
in un'applicazione ASP.NET 2.0, utilizzando sia il ChangePasswordTemplate
e SuccessTemplate
per definire uno stile personalizzato. Le caselle di testo dispongono di ID come segue
attuale Login Password Casella di testo = CurrentPassword
Nuovo ID password Casella di testo = NuovaPassword
Conferma nuova password ID = Casella di testo ConfirmPassword
Per motivi DRY
, voglio usare l'espressione regolare che viene definito nel provider personalizzato appartenenza per convalidare il nuovo lato client password. Purtroppo, l'impostazione delle proprietà del controllo ChangedPassword
come segue
ChangePassword.NewPasswordRegularExpression =
Membership.PasswordStrengthRegularExpression;
ChangePassword.NewPasswordRegularExpressionErrorMessage =
"Regex Error Message";
nel Page_Init
imposta l'espressione al valore atteso, ma non causa la convalida lato client per accadere sulla nuova password (la pagina viene rinviata e il testo fallimento Membership ChangePassword
di serie viene visualizzato).
ho potuto utilizzare un RegularExpressionValidator
nel ChangePasswordTemplate
e impostare la proprietà ValidationExpression
al Membership.PasswordStrengthRegularExpression
, ma il modo migliore che posso vedere per fare questo richiede recursing attraverso i controlli nel modello per trovare il RegularExpressionValidator
e impostando la proprietà, il che mi fa credere che ci deve essere un modo più elegante. Ho altri controlli di convalida nel modello (campi richiesti e un validatore confrontare), nel caso in cui questo potrebbe essere la causa di un conflitto con utilizzando le proprietà di validazione ChangePassword
.
La mia domanda è, allora, funziona proprietà ChangePassword
del controllo NewPasswordRegularExpression
quando si utilizzano modelli o ho bisogno di imboccare la strada di controllo RegularExpressionValidator
?
Modifica
offerto una taglia su questo come non riesco a trovare una risposta definitiva sul perché di proprietà ChangePassword
del controllo NewPasswordRegularExpression
non convalida lato client.
Soluzione
Se si utilizza "Convert to template", il controllo RegularExpressionValidator non viene creata automaticamente e, pertanto, non ha reso alla pagina finale. Questo può essere confermato visualizzando il sorgente della pagina, prima e dopo la conversione al modello.
Per aggiungere un RegularExpressionValidator esattamente come quella ASP.NET utilizza senza il modello, definirlo tra il NuovaPassword TextBox e la RequiredFieldValidator in questo modo:
<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>
Non è possibile utilizzare la proprietà NewPasswordRegularExpression del ChangePassword di modificare l'espressione regolare a questo punto. Dovrete fare questo, invece:
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";
}
Spero che questo aiuta.
Altri suggerimenti
Ci dispiace c'è voluto troppo misi molto a tornare.
PasswordStrengthRegularExpression viene convalidato al lato server. e NewPasswordRegularExpression convalidato al lato client. E qui è la differenza. A causa di bug nella convalida JSScript / VSScript Regx, ogni espressione regolare che viene convalidato sul server non sarà convalidato in browswer.
Inoltre, la password viene ottenere convalidato con NewPasswordRegularExpression pure PasswordStrengthRegularExpression. Quindi NewPasswordRegularExpression non dovrebbe rompere la regola definita in PasswordStrengthRegularExpression.
es.
passwordStrengthRegularExpression="^*(?=.{7,})(?=(.*\W){1,})(?=(.*\d){1,})"
NewPasswordRegularExpression="^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\W).*$"
funziona bene.
Spero che questo ti aiuta.
Aggiorna : regex lookahead bug.
http://blog.stevenlevithan.com/archives/regex-lookahead-bug