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

时间:2008-12-10 10:17:16

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

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

这是我需要自己实现的,还是本来应该得到支持?

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

解决方案

羞耻我无法标记两个答案,Dave R提供的链接深入了解了会员的工作方式,Zhaph指出的是我最终做的事情,处理自定义中的锁定逻辑会员提供者。

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

4 个答案:

答案 0 :(得分:7)

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

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

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

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

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

我希望这会有所帮助。

答案 1 :(得分:3)

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

默认数据库模式在aspnet_Membership表中包含以下列:

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

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

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

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

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