代码之家  ›  专栏  ›  技术社区  ›  e36M3

登录控件和自定义成员资格提供程序

  •  6
  • e36M3  · 技术社区  · 15 年前

    我正致力于实现一个自定义成员资格提供程序,该程序针对数据库中的现有模式工作,并有一些想法/问题。

    登录控件将自动调用成员资格提供程序的ValidateUser方法,因此无论我如何实现提供程序,登录控件唯一关心的是此方法返回的bool值。我感到困惑的是,登录尝试失败的原因可能有很多;用户被锁定,在一段时间内尝试过多,等等。我看不到任何方法可以将其传达给控件,以便它可以显示正确的消息。成员资格提供程序的其他属性(如PasswordStrengthRegularExpression)对登录控件也完全没有影响(开箱即用),我本来希望它能以某种方式自动转换为正则表达式验证器,但事实似乎并非如此。因此,如果我想让这些设置承担控件本身的责任,似乎需要在提供程序配置之外使用这些设置初始化登录控件属性。

    如果登录控件在框外执行的唯一操作(不需要手动处理事件和执行上述初始化)是调用成员资格提供程序上的ValidateUser方法,则无法将验证失败的原因返回给登录控件,甚至无法执行基于一定的时间窗口。最终,我的问题是,为什么我还要将成员资格提供程序与登录控件结合使用呢?它似乎只为Yes/No类型的响应而设计,这是非常有限制的。如果我想用不同的消息返回给用户,我需要处理登录控件事件,调用我自己的身份验证类,这些类将处理我的所有业务需求,并将自定义错误消息返回给登录控件以显示给用户,以便他们知道其尝试无效的原因。

    除非我的假设是错误的,否则作为成员资格API的登录控件之间的接口似乎太过限制而没有用处。也许API对其他auth控件(如ChangePassword)的效果更好,但对于实际的登录控件,我不认为有什么意义。

    我很感激你的想法。

    3 回复  |  直到 15 年前
        1
  •  4
  •   Igor Zelaya    15 年前

    你是对的。要实现您正在讨论的逻辑,您需要实现Authenticate事件。这样,您可以在完成自己的验证后写回自定义错误消息。

    另一方面,我认为密码强度不应该在身份验证时验证,而应该在用户创建时验证。

    你可以这样写:

    protected void Login_Authenticate(object sender, AuthenticateEventArgs e)
    {
        try
        {
           e.Authenticated = myMembershipProvider.ValidateUser(LoginControl1.UserName,LoginControl.Password);
    
        }
        catch(Exception ex)
        {
          LoginControl1.FailrureText = ex.Message;
        }
    }
    

        2
  •  2
  •   Community Mohan Dere    8 年前

    我在使用与登录相关的方法(更改密码)时遇到了同样的问题,在成员资格提供程序中,我需要更多信息,然后只需要一个Yes/No。希望您可以实现类似于我提出的解决方案的解决方案。请参阅:

    Membership provider ChangePassword method return type problem

        3
  •  1
  •   Muktadir    15 年前

    好吧,如果你不能改变登录控制的东西,你最终将需要另一个登录控制界面!