我正在使用标准的.NET成员资格提供程序,并想知道是否有人可以对其进行说明。

调用ValidateUser返回true或false。现在,由于该方法接受用户名和密码,因此将导致返回结果反射(reflect)无效的用户名或密码。但是,如果我们进一步研究它,我们发现它也在检查IsLockedOut和IsApproved。

public override bool ValidateUser (string username, string password)
{
    MembershipUser user = GetUser (username, false);
    /* if the user is locked out, return false immediately */
    if (user.IsLockedOut)
        return false;
    /* if the user is not yet approved, return false */
    if (!user.IsApproved)
        return false;
    ......

在我的应用程序中,我想以自己的方式使用IsApproved。仅仅滚动我自己的提供程序是行不通的,因为我仍然受制于bool结果。创建用户可以为我们提供所需的所有信息,那么为什么不使用ValidateUser?我想念什么吗?

最佳答案

我希望您看到的是一项安全决策-通过限制返回的信息,他们不会向恶意方提供信息。

假设您是西里尔·克拉克(Cyril Cracker),试图闯入一个网站。

方案1:
您尝试输入用户名“Admin”和密码“Password”,系统提示您不要输入密码。您仅有的信息是“管理员/密码”不是有效的组合。

方案2:
您尝试输入用户名“Admin”和密码“Password”,系统会告诉您该名称的用户未知。您可以继续尝试使用其他用户名,直到找到已知的用户名为止。

方案3:您尝试输入用户名“Admin”和密码“Password”,系统会告诉您没有密码无效。突然,您知道“管理员”是有效用户。您已经学到了一些有用的信息,并且需要不断猜测的只是密码。

方案4:您尝试输入用户名“Admin”和密码“Password”,系统告诉您该帐户已被阻止。现在,您知道有效的用户名和密码,并且该帐户已被阻止。您可以稍后再试。

导致Bean泄漏有效和无效的系统被称为 chatty系统,并且由于容易破解而被认为是不安全的,这是有充分理由的。

希望这会有所帮助。

关于asp.net-membership - 为什么ValidateUser不返回更多?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/544646/

10-17 02:23