我们已经实施了自定义成员资格提供程序,并在使用此提供程序的网页上设置了更改密码控制。此成员资格提供程序类中的 ChangePassword 方法通过连接到外部 Web 服务来检查有关密码强度和有效性的一些业务逻辑。如果有任何问题(长度问题、需要特殊字符等),Web 服务能够准确返回新密码的问题。
现在,必须由自定义提供程序覆盖的 ChangePassword 方法的签名是:
public override bool ChangePassword(string username, string oldPassword, string newPassword)
因此,即使我知道用户提供的新密码的确切问题,我也无法在网页上显示它,因为我只能从此方法返回真或假,然后更改密码控制接管并自己执行魔术取决于布尔返回值。我可以连接控件的OnChangePasswordError
事件ChangePassword
以显示静态错误消息,或者我什至可以FailureText
在发生错误时将此控件的属性设置为一些硬编码字符串,但我无法向用户提供究竟是什么错误使用他们提供的密码。
protected void OnPasswordChangeError(object sender, EventArgs e)
{
throw new MembershipPasswordException("Tell user what exactly is wrong with the password they supplied");
}
该类MembershipProvider
有一个ValidatingPassword
事件,在更改密码之前引发,我可以通过检查密码是否符合条件来抛出异常,但该异常似乎仍然没有传递给 ChangePassword 控件。这是 ValidatingPassword 事件处理程序的代码:
void MyMembershipProvider_ValidatingPassword(object sender, ValidatePasswordEventArgs e)
{
//if password not valid
e.Cancel = true;
e.FailureInformation = new MembershipPasswordException();
e.FailureInformation;
}
如何将特定信息从 Membership 提供程序类的 ChangePassword 方法发送到 ChangePassword 控件,以向用户显示正确的、非静态/硬编码的密码更改错误消息?有没有办法将 ValidatePasswordEventArgs 连接到 OnChangePassword 方法的 EventHandler 中的 EventArgs,以便我可以在 ChangePassword 控件中获取 FailureInformation?
从我最初的研究来看,这似乎是不可能的。虽然我觉得MS团队不会忽视这一点,应该有办法。
几点建议:
MembershipUser.ChangePassword 在没有警告的情况下失败 http://forums.asp.net/t/983613.aspx