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

锁定ASP.Net自定义成员资格提供程序中的用户

  •  6
  • RSlaughter  · 技术社区  · 17 年前

    为了适应我们的数据库模式,我不得不为我当前的ASP.Net项目创建一个自定义成员资格提供程序,并且在配置它以锁定用户(如果用户密码错误三次)时遇到问题,这是标准提供程序所支持的。

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

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

    解决方案

    遗憾的是,我不能给出两个答案,Dave R提供的链接非常深入地介绍了成员资格是如何工作的,而Zhaph指出的正是我最后所做的,处理自定义成员资格提供程序中的锁定逻辑。

    然后,我使用登录控件的LoginError事件处理了错误情况,并在那里进行了检查,以查看用户是否被锁定,以便显示相应的错误消息。

    4 回复  |  直到 17 年前
        1
  •  7
  •   Dave R.    17 年前

    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

    实际上,我建议大家阅读整个系列。斯科特是个优秀的沟通者。

    我希望这有帮助。

        2
  •  3
  •   Zhaph - Ben Duguid    17 年前

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

    默认数据库架构在aspnet_成员资格表中具有以下列:

    IsLockedOut
    FailedPasswordAttemptCount
    FailedPasswordAttemptWindowStart
    

    maxInvalidPasswordAttempts="5"
    passwordAttemptWindow="10"
    

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

        3
  •  3
  •   Samo Fabčič    16 年前

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

    if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
           {
                    for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                    {
                        Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                    }
            }
    
        4
  •  0
  •   Michiel    17 年前

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

    推荐文章