登录控制和自定义成员资格提供

时间:2010-10-11 19:40:28

标签: c# asp.net asp.net-membership membership-provider

我正在努力实现一个自定义成员资格提供程序,该资源提供程序可以对付我数据库中的现有模式,并且有一些想法/问题。

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

如果Login控件开箱即用(没有手动处理事件并按上述方式进行初始化)唯一的事情就是调用成员资格提供程序上的ValidateUser方法,我看不到回传给Login控件的方法为什么验证失败甚至做某些事情,比如根据某个时间窗口限制验证请求。最后我的问题是为什么我甚至会使用会员提供商与登录控制一起使用?它似乎只是针对Yes / No类型响应而设计,这是非常严格的。如果我想将不同消息的逻辑构建回用户,我需要处理登录控制事件并调用我自己的身份验证类来处理我的所有业务需求,并将自定义错误消息返回给Login控件向用户显示,以便他们知道为什么他们的尝试无效。

除非我的假设出错,否则Login控件作为成员资格API之间的界面似乎过于严格,无法使用。也许API更适合其他auth控件,比如ChangePassword更好,但对于实际的Login控件,我没有看到重点。

感谢您的想法。

3 个答案:

答案 0 :(得分:4)

你是对的。要实现您正在讨论的逻辑,您需要实现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;
    }
}

并在ValidateUser方法中抛出自定义Exception。快乐的编码...

答案 1 :(得分:2)

我在使用与会员提供商的登录相关方法(更改密码)时遇到了同样的问题,我想要更多信息,然后只是一个是/否。希望您能够实现类似于我提出的解决方案的解决方案。见:

Membership provider ChangePassword method return type problem

答案 2 :(得分:1)

哦,如果你不能改变Login-control的话,你最终还是需要另一个登录控制界面!