c# - 登录控制和自定义成员(member)提供者

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

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

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

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

除非我的假设有误,否则作为成员资格 API 的登录控件之间的接口(interface)似乎限制太多而无用。也许 API 对于 ChangePassword 等其他身份验证控件效果更好,但对于实际的登录控件,我不明白这一点。

我很欣赏你的想法。

最佳答案

你是对的。要实现您正在谈论的逻辑,您需要实现 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 方法中抛出您的自定义异常。快乐编码...

关于c# - 登录控制和自定义成员(member)提供者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3909389/

相关文章:

javascript - 带有更新面板的 div 之间的转换

c# - 是否应在 Web 应用程序中禁用 Entity Framework 延迟加载?

javascript - 在 .Net 中通过 JavaScript 验证匹配密码?

c# - 我应该使用 Ruby 构建什么类型的应用程序?

c# - 如何使用 C# 中的 select 调用 MySQL 存储过程

c# - 如何仅为 DataGrid 中的列子集实现水平滚动条?

c# - 在 ASP.net 中使用静态方法进行安全验证是不明智的吗?

asp.net - 将 ASP.Net 身份验证与 ASP.Net MVC 结合使用有什么真正的好处吗?

asp.net-mvc - 用户在线吗?

c# - RadGrid 底部的水平滚动空白