gpt4 book ai didi

.net - 默认成员(member)提供者的 OnValidatingPassword 是否必须在自定义实现中被覆盖?

转载 作者:行者123 更新时间:2023-12-04 06:34:57 26 4
gpt4 key购买 nike

我正在为我的 .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);
}
}

这很令人困惑,但我相信这样做的目的是为外部逻辑提供一个参与密码验证的钩子(Hook);自定义提供者仍需要编写自己的验证逻辑。

如果您查看 SQL Membership Provider 的源代码(下载 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, password, true );
OnValidatingPassword( e );

if( e.Cancel )
{
status = MembershipCreateStatus.InvalidPassword;
return null;
}

编辑

我认为部分混淆是基于 OnValidatingPassword 的名称。 ,并且这似乎暗示它正在处理密码验证,而不是引发事件以让其他代码验证密码。对于它的值(value),我理解这种混淆——如果方法被命名为 RaiseValidatingPasswordEvent 可能会更清楚。 .

无论如何,您可以查看 Event Design .NET 4 的指南。大约在页面的中间,您会发现:

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".

关于.net - 默认成员(member)提供者的 OnValidatingPassword 是否必须在自定义实现中被覆盖?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7654022/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com