OnValidatingPassword是一种虚方法. example from Microsoft不会覆盖该方法.
这个question也遇到了同样的问题,但是作者放弃了对他的问题的回答并简单地覆盖了这个功能.这个answer states没有必要覆盖它的功能.
基本功能没有做任何事情吗?当我重写OnValidatePassword,并简单地调用基类时,我的函数被命中,但它永远不会拒绝我太简单的密码.
protected override void OnValidatingPassword(ValidatePasswordEventArgs e) { base.OnValidatingPassword(e); } // // MembershipProvider.CreateUser // public MembershipUser CreateUser(string username,string password,string globalIdentifier,string firstName,string lastName,string birthDate,object providerUserKey,out MembershipCreateStatus status) { ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username,password,true); OnValidatingPassword(args); if (args.Cancel) { status = MembershipCreateStatus.InvalidPassword; return null; }
解决方法
查看Reflector中的方法证实了这一点:
protected virtual void OnValidatingPassword(ValidatePasswordEventArgs e) { if (this._EventHandler != null) { this._EventHandler(this,e); } }
这很令人困惑,但我相信这意味着这为外部逻辑提供了一个参与密码验证的钩子;自定义提供程序仍需要编写自己的验证逻辑.
如果您查看sql成员资格提供程序的源代码(下载Provider Toolkit Samples),您将看到它包含验证密码的逻辑,并且还调用OnValidatingPassword.以下代码来自CreateUser方法:
if( password.Length < MinrequiredPasswordLength ) { status = MembershipCreateStatus.InvalidPassword; return null; } int count = 0; for( int i = 0; i < password.Length; i++ ) { if( !char.IsLetterOrDigit( password,i ) ) { count++; } } if( count < MinrequiredNonAlphanumericCharacters ) { status = MembershipCreateStatus.InvalidPassword; return null; } if( PasswordStrengthRegularExpression.Length > 0 ) { if( !Regex.IsMatch( password,PasswordStrengthRegularExpression ) ) { status = MembershipCreateStatus.InvalidPassword; return null; } } ValidatePasswordEventArgs e = new ValidatePasswordEventArgs( username,true ); OnValidatingPassword( e ); if( e.Cancel ) { status = MembershipCreateStatus.InvalidPassword; return null; }
编辑
我认为部分混淆是基于OnValidatingPassword的名称,并且它似乎暗示它正在处理密码验证,而不是引发事件让其他代码验证密码.对于它的价值,我理解了这种混淆 – 如果该方法被命名为RaiseValidatingPasswordEvent,它可能会更清楚.
在任何情况下,您都可以查看.NET 4的Event Design指南.大约在页面的中间位置,您会发现:
Do use a protected virtual method to raise each event.
The name of the protected virtual method should be the same as the event name prefixed with On. For example,the protected virtual method for an event named “TimeChanged” is named “OnTimeChanged”.