【问题标题】:Locking out a user in an ASP .Net Custom Membership Provider在 ASP .Net 自定义成员资格提供程序中锁定用户
【发布时间】:2008-12-10 10:17:15
【问题描述】:

我必须为我当前的 ASP .Net 项目创建一个自定义成员资格提供程序,以适应我们的数据库架构,并且在配置它以锁定用户时遇到问题,如果用户密码错误三次,例如受标准提供商支持。

这是我需要自己实现的东西,还是应该得到固有的支持?

我没有专门处理它的代码(并且似乎没有一个接口成员专门处理它),但是如果我需要自己实现它,我该如何通知用户他们被锁定了?我需要在 ValidateUser 中引发某种异常吗?

解决方案

遗憾的是,我无法标记两个答案,Dave R 提供的链接深入了解了会员的工作原理,而 Zhaph 指出的正是我最终要做的,处理自定义中的锁定逻辑会员提供者。

然后,我使用 Login 控件的 LoginError 事件处理错误情况,并在那里签入以查看用户是否被锁定以显示相应的错误消息。

【问题讨论】:

    标签: .net asp.net membership membership-provider lockout


    【解决方案1】:

    Scott Mitchell 在 ASP.NET 站点上编写了一系列优秀的教程。此链接包含有关创建自定义提供程序的信息并讨论了锁定逻辑:

    http://www.asp.net/LEARN/security/tutorial-06-cs.aspx

    也没有解锁帐户的内置方法(即,如果您使用类似于 SqlMembershipProvider 的东西,则必须通过数据库工具来完成此操作)。 Scott 还写了一篇关于创建 UI 来管理它的文章,您可以在此处找到该文章:

    http://www.asp.net/LEARN/security/tutorial-14-vb.aspx

    我实际上建议阅读整个系列。 Scott 是一位出色的沟通者。

    我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      这是你必须自己写的东西。

      默认数据库架构在 aspnet_Membership 表中具有以下列:

      IsLockedOut
      FailedPasswordAttemptCount
      FailedPasswordAttemptWindowStart
      

      在尝试窗口内每次失败的尝试都会增加尝试计数,并且第一次失败尝试的时间存储在窗口开始列中,一旦 FailedPasswordAttemptCount 等于配置中的 maxInvalidPasswordAttempts,则设置 IsLockedOut。

      正如 Michiel 所说,您的 ValidateUser 方法将需要根据提供程序配置中的设置检查这些值 - 默认情况下,这些值是:

      maxInvalidPasswordAttempts="5"
      passwordAttemptWindow="10"
      

      一旦用户达到最大登录尝试次数,您需要确保已设置 MembershipUser.IsLockedOut 是从您的提供商设置的 - 然后您可以检查该值并采取适当的行为 - 如果您使用默认登录控件,这个值可能已经为你检查过了。

      【讨论】:

        【解决方案3】:

        复制导致锁定的条件(太多错误的登录尝试)。 由于会员资格提供商每次都会访问其后端,因此明智的做法是将这种方法限制为具有合理数量的 MaxInvalidPasswordAttempts 的提供商。

        if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
               {
                        for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                        {
                            Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                        }
                }
        

        【讨论】:

          【解决方案4】:

          在您的自定义成员资格提供程序中,您应该实现 ValidateUser 函数。在那里,您不仅可以检查用户名和密码是否有效,还可以从数据存储中检索无效密码尝试的次数等。如果用户名/密码有效,则重置密码尝试次数,否则增加尝试次数。 SqlMembershipProvider 还存储 LastAttempt 日期时间,因此您不能强行进入,因为您不允许在特定时间范围内尝试。

          【讨论】:

            猜你喜欢
            • 2012-08-23
            • 1970-01-01
            • 2012-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-08-25
            • 1970-01-01
            相关资源
            最近更新 更多