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

6
我正在实现一个自定义成���资格提供程序,它针对我的数据库中的现有架构工作���并有一些想法/问题。
登录控件将自动调用成员资��提供程序的ValidateUser方法,因此无论我如何实现提供��序,登录控件关心的唯一事情就是此方法返回的bool值��� 我困惑的是,可能有许多原因导致登录尝试失败; 用���被锁定,在一段时间内尝试次数过多等。 我看不到任何传达给控件以便宜显示正确消息的方法。 成员资格提供程序的其他属性,例如PasswordStrengthRegularExpression,在登录控件上也没有任何影响(开箱即用),我希望它会自动转换为正则表达式验证器,但似乎并非如此。 因此,如果我希望它们在控件本身上起作用,则似乎需要从提供程序配置中初始化登录控件属性。
如果登录控件开箱即用(无需手动处理事件并执行上述初始化)的唯一操作是调用成员资格提供程序的ValidateUser方法,那么我看不到向登录控件传回验证失败原因甚至执行基于某个时间窗口的验证请求限制等操作的方法。 最终我的问题是,为什么我要与登录控件一起使用成员资格提供程序呢? 它似乎仅设计用于Yes / No类型的响应,这非常限制。 如果我想构建带有不同消息的逻辑以返回给用户,我需要处理登录控件事件并调用我的自己的身份验证类,该类将处理所有业务需求并返回自定义错误消息以供Login控件显示给用户,以便他们知道为什么他们的尝试无效。
除非我的假设是错误的,否则似乎登录控件作为成员资格API之间的接口过于受限而无法使用。 也许API在ChangePassword等其他身份验证控件上的工作更好,但对于实际的Login控件,我看不出有什么意义。
感谢您的想法。
3个回答

4

你说得对。要实现你所说的逻辑,需要实现认证事件,这样在您自己的验证后,您可以编写自定义错误消息。

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

您可以编写以下内容:

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方法中抛出自定义异常。祝编码愉快...

会员提供程序在那时对我失去了价值,不是吗?如果我继续处理Authenticate事件,那么我必须自己调用提供程序上的ValidateUser方法。该方法将不足以满足我的需求,因此我必须调用另一个方法来告诉我登录失败的原因。我同意您关于密码强度的观点。 - e36M3
@e36M3 - 是的,你说得对。那就是正确的方法。我的做法是首先调用所有验证方法,将错误写入控件的ErrorMessage属性中,最后如果出现问题, - Igor Zelaya

2
我在使用Membership Provider中与登录相关的方法(更改密码)时遇到了同样的问题,我希望得到比只是“是/否”更多的信息。希望你能够实现类似于我想出的解决方案的解决方法。请参阅此链接:Membership提供程序ChangePassword方法返回类型问题

谢谢,很高兴知道我没有疯掉。但是感觉我们在这里缺少了什么?这让我想要放弃会员提供程序。如果我必须要对其进行修改以及对控件进行修改才能使其正常工作并获得更有帮助的错误消息,那么我就不需要它了。对我来说,提供程序唯一的好处就是与控件的开箱即用集成,但这似乎非常有限。 - e36M3

1
好的,如果您无法更改登录控件的事情,最终您将需要另一个登录控件界面!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接