.net – 是否必须在自定义实现中覆盖默认的成员资格提供程序的On
我正在为我的.net应用程序实现自定义成员资格提供程序.我已经设置了最少数量的字符和非字母数字字符的配置,但它似乎无论如何都要通过密码,即使它们违反了规则.
OnValidatingPassword是一种虚方法. example from Microsoft不会覆盖该方法. 这个question也遇到了同样的问题,但是作者放弃了对他的问题的回答并简单地覆盖了这个功能.这个answer states没有必要覆盖它的功能. 基本功能没有做任何事情吗?当我重写OnValidatePassword,并简单地调用基类时,我的函数被命中,但它永远不会拒绝我太简单的密码. 代码示例(使用自定义CreateUser函数) 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; } 解决方法
MembershipProvider.OnValidatingPassword的文档仅声明如果处理程序已注册,它会引发ValidatingPassword事件,而不是它实际验证密码.
查看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指南.大约在页面的中间位置,您会发现:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何在ASP.NET MVC中使用单选模式创建ListB
- 如何避免ASP.NET中的快速页面刷新?
- 使用xmlhttp的经典ASP页面可以发出JSON请求吗?
- asp.net-mvc – ASP.Net MVC – 重定向到路由提供Redirect
- asp.net-mvc – 动作命名约定
- Asp.Net MVC – 重载动作方法
- asp.net-mvc-3 – Asp.net mvc 3-获取当前控制器实例(不只是
- asp.net-core – 如何将ASP.NET 5从Beta6升级到Beta7
- asp.net-mvc – 从控制器内部使用Html.ActionLink和Url.Act
- asp.net – 从存储过程获取结果以填充GridView
- asp.net MVC的Html.RadioButton生成id和名称相同
- asp.net – Linq-to-SQL和DateTime的奇怪
- asp.net-mvc – MVC routes.MapRoute name属性
- 关于asp.net调用gemalto超级狗api的具体实现
- asp.net – 如何在codebehind中更新dotnetnuke u
- asp.net – JQGrid不显示数据
- asp.net-mvc – 通知面板类似于stackoverflow的
- 在ASP.Net日历控件中默认选择当前日期
- asp.net-mvc – 在IIS Express中测试SignalR应用
- asp.net-mvc – 如何实现在jqgrid搜索?