【问题标题】:Custom ASPNetMembership FailureInformation always null, OnValidatingPassword issue自定义 ASPNetMembership FailureInformation 始终为空,OnValidatingPassword 问题
【发布时间】:2011-01-06 04:23:02
【问题描述】:

如此处所述http://msdn.microsoft.com/en-us/library/system.web.security.membershipprovider.onvalidatingpassword.aspx

“当 ValidatingPassword 事件完成时,可以检查作为 e 参数提供的 ValidatePasswordEventArgs 对象的属性,以确定是否应取消当前操作,以及是否应抛出存储在 FailureInformation 属性中的特定异常。 "

这里有一些细节/代码,它真正说明了为什么 FailureInformation 可能为空 http://forums.asp.net/t/991002.aspx

根据我的会员设置,我应该得到一个密码与密码安全条件不匹配的异常,但它没有发生。

然后我确实尝试调试 System.Web.ApplicationServices.dll(在 .NET 4.0 System.Web.Security 位于此处)框架代码以查看那里实际发生的情况,但我无法进入此程序集,可能是因为这个[TypeForwardedFrom("System.Web, Version=2.0.0.0, Culture=Neutral, PublicKeyToken=b03f5f7f11d50a3a")] public abstract class MembershipProvider : ProviderBase

我可以很容易地进入任何另一个 .NET 4.0 程序集,但在这个程序集中不行。我确实检查了,System.Web.ApplicationServices.dll 的符号已加载。

现在我只知道如何修复它 - 覆盖方法 OnValidatingPassword(ValidatePasswordEventArgs e)。

这就是我的故事。

也许有人会有所帮助:

1) 任何想法为什么 OnValidatingPassword 不起作用?

2) 任何想法如何进入它?

【问题讨论】:

    标签: asp.net .net-4.0 asp.net-membership asp.net-4.0


    【解决方案1】:

    又读了一遍http://forums.asp.net/t/991002.aspx。这是我的解决方案

        //Override OnValidatingPassword
        protected override void OnValidatingPassword(ValidatePasswordEventArgs args)
        {
            //Any logic to process password validation conditions
            //e.g:
            if (args.Password.Length < MinRequiredPasswordLength)
                args.FailureInformation = new ArgumentException(String.Format("Password is too short, min password length {0}", MinRequiredPasswordLength.ToString()));
    
            if (args.UserName == args.Password)
                args.FailureInformation = new ArgumentException(String.Format("Password should not be equal to username"));
    
            //Also here could be any logic to throw an exception if needed
            //e.g:
            if (args.FailureInformation != null)
                throw args.FailureInformation;
    
            //Calling base
            base.OnValidatingPassword(args);
    
            if (args.Cancel)
            {
                if (args.FailureInformation == null)
                    args.FailureInformation = new ArgumentException(String.Format("Custom Password Validation Failure for password '{0}'", args.Password));
    
                throw args.FailureInformation;
            }
        }
    

    【讨论】:

    • 我对此感到困惑——如果您必须对 MinRequiredPassword 长度和其他配置项进行比较,基本方法实际上会做什么?
    • @pc1oad1etter 我的完整实现包含检查密码不包含用户名的逻辑,基本实现不这样做,也许你是对的,如果我自己检查所有其余配置值,则不需要调用 base .
    【解决方案2】:

    您不必重写 OnValidatingPassword 方法,但正如文档所述,您需要处理 ValidatingPassword 事件。检查MembershipValidatePasswordEventHandler。

    使用 .NET Reflector 并检查 SqlMembershipProvider 类的 ChangePassword 方法。您将看到 SqlMembershipProvider 没有为 ValidatingPassword 事件注册任何处理程序。

    所以我的想法是在您注册到 Membership.ValidatingPassword 的自定义会员提供程序的 OnInit 中,并在处理程序中进行编码。上面链接中的示例。

    希望我没有误解你的问题。

    【讨论】:

    • 我第一次完全一样,这段代码不会验证密码。如果密码错误,“this.OnValidatingPassword(e)”没有向“e.FailureInformation”添加任何相关信息或将“e.Cancel”设置为true。这就是为什么我提到看起来我需要覆盖它,最后我做了什么。
    • 请不要在像 SO 这样的公共论坛上展示被反编译的专有代码,因为不允许阅读此内容的人为 ie 做贡献。 Mono mono-project.com/Contributing
    • Pauli Østerø:感谢您指出这一点。从来没有想过已经公开的源代码会有查看限制。我已经编辑了我的帖子。
    【解决方案3】:

    您的问题似乎表明您正在使用自定义会员服务提供商?所以我假设你是直接实现 MembershipProvider ?

    class MyMembershipProvider : MembershipProvider{...}

    在这种情况下,永远不会自动调用 OnValidatingPassword...您必须自己调用它。

    所以,基本上我很困惑。你能澄清一下你的设置吗?您使用的是默认会员提供商还是自定义会员提供商?如果自定义,您从哪个类继承?

    至于看代码,可以用Reflector来做。

    【讨论】:

    • 我从 MembershipProvider 继承。我确实称它为我自己,但它没有做任何帮助。
    猜你喜欢
    • 2020-06-04
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2018-12-31
    • 1970-01-01
    相关资源
    最近更新 更多