【发布时间】:2010-12-30 22:35:51
【问题描述】:
我们实施了自定义成员资格提供程序,并在使用此提供程序的网页上设置了更改密码控件。此成员资格提供程序类中的 ChangePassword 方法通过连接到外部 Web 服务来检查有关密码强度和有效性的一些业务逻辑。如果有任何问题(长度问题、需要特殊字符等),Web 服务能够准确返回新密码的问题。
现在,必须由自定义提供程序覆盖的 ChangePassword 方法的签名是:
public override bool ChangePassword(string username, string oldPassword, string newPassword)
因此,即使我知道用户提供的新密码的确切问题,我也无法在网页上显示它,因为我只能从此方法返回真或假,然后更改密码控制接管并根据布尔返回值发挥自己的魔力。我可以连接ChangePassword 控件的OnChangePasswordError 事件以显示静态错误消息,或者我什至可以在发生错误时将此控件的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 eventHandler 的代码:
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 fails without warning http://forums.asp.net/t/983613.aspx
【问题讨论】:
-
我不会放弃它,但我认为你需要想出一个技巧,比如将它写入数据库之类的。
标签: asp.net-membership membership-provider asp.net-webcontrol