6

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

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

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

解决方案

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

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

4

4 回答 4

7

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

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

我希望这有帮助。

于 2008-12-10T13:48:02.077 回答
3

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

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

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

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

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

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

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

于 2008-12-10T13:56:28.737 回答
3

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

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
       {
                for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                {
                    Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                }
        }
于 2010-01-14T12:40:22.877 回答
0

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

于 2008-12-10T13:15:48.647 回答