ChangePassword控件和设置新密码的正则表达式

时间:2009-11-13 10:34:57

标签: asp.net validation change-password

这似乎应该有一个简单的解决方案,但我似乎无法找到它。

我在ASP.NET 2.0应用程序中使用ChangePassword控件,同时使用ChangePasswordTemplateSuccessTemplate来定义自定义样式。文本框的ID如下

当前密码文本框ID = CurrentPassword
新密码文本框ID = NewPassword
确认新密码文本框ID = ConfirmPassword

出于DRY原因,我想使用自定义成员资格提供程序中定义的正则表达式来验证新密码客户端。不幸的是,设置ChangedPassword控件的属性如下

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

将表达式设置为期望值,但不会导致客户端验证发生在新密码上(页面回发并显示标准成员资格ChangePassword失败文本)。

我可以在RegularExpressionValidator中使用ChangePasswordTemplate并将ValidationExpression属性设置为Membership.PasswordStrengthRegularExpression,但我能看到这样做的最佳方式需要通过控件进行递归在模板中找到RegularExpressionValidator并设置属性,这让我相信必须有一个更优雅的方式。我在模板中有其他验证器控件(必填字段和比较验证器),以防这可能导致与使用ChangePassword验证属性发生冲突。

我的问题是,ChangePassword控件的NewPasswordRegularExpression属性在使用模板时是否有效,或者我是否需要沿着RegularExpressionValidator控制路线走下去?

修改

对此提供了赏金,因为我无法找到关于为什么ChangePassword控件的NewPasswordRegularExpression属性不验证客户端的明确答案。

2 个答案:

答案 0 :(得分:2)

如果使用“转换为模板”,则不会自动创建RegularExpressionValidator控件,因此不会将其呈现到最终页面。这可以通过在转换为模板之前和之后查看页面源来确认。

要添加一个与没有模板的ASP.NET完全相同的RegularExpressionValidator,请在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>

此时无法使用ChangePassword的NewPasswordRegularExpression属性更改正则表达式。你必须这样做:

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";
}

我希望这会有所帮助。

答案 1 :(得分:0)

抱歉,我花了太长时间才回来。

PasswordStrengthRegularExpression在服务器端验证。和NewPasswordRegularExpression在客户端验证。这就是区别。由于JSScript / VSScript Regx验证中的错误,在服务器上验证的每个正则表达式都不会在browswer中验证。

此外,密码将通过NewPasswordRegularExpression以及PasswordStrengthRegularExpression进行验证。所以NewPasswordRegularExpression不应该破坏PasswordStrengthRegularExpression中定义的规则。

e.g。

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

工作正常。

希望这会对你有所帮助。

更新:regex lookahead bug。
http://blog.stevenlevithan.com/archives/regex-lookahead-bug