用户无需在localhost上提供密码即可登录

时间:2011-02-21 18:49:29

标签: asp.net forms-authentication

我有一个基于C#和表单身份验证构建的Asp.net网站。我们使用Active Directory对用户进行身份验证,一切正常。但今天我们意识到只需输入用户名并点击登录即可登录任何帐户,无需提供任何密码!这只发生在localhost上运行的开发环境中(感谢上帝!),但我不喜欢它......

我之前从未见过这种行为,并且真的希望有人解释这是怎么发生的。这是Microsoft构建的开发人员功能吗?或者我的办公室有人在没有告诉其他人的情况下做了一个后门?我将进一步研究这最后一个选项,但在那之前 - 有没有人遇到过这个?

提前非常感谢!

修改 这是我输入的每个用户名的身份验证返回true的地方 - 密码为空。其他密码返回false。

using (var context = new PrincipalContext(ContextType.Domain))
{
   result = context.ValidateCredentials(username, password);
}

PrincipalContextSystem.DirectoryServices.AccountManagement

的默认值

4 个答案:

答案 0 :(得分:3)

经过一些调查后,我在MSDN上找到了this,其中说明:

  

ValidateCredentials 方法绑定到构造函数中指定的服务器。如果username和password参数为null,则验证构造函数中指定的凭据。如果构造函数中未指定凭据,并且用户名和密码参数为null,则此方法将验证当前主体的默认凭据。

以及PrincipalContext constructor的文档中的此信息:

  

public PrincipalContext(System.DirectoryServices.AccountManagement.ContextType contextType,string name):
   contextType: System.DirectoryServices.AccountManagement.ContextType枚举值,指定主体上下文的商店类型。
   name: System.DirectoryServices.AccountManagement.ContextType.Domain上下文类型的域或服务器的名称,System.DirectoryServices.AccountManagement.ContextType.Machine上下文类型的计算机名称,或者名称托管System.DirectoryServices.AccountManagement.ContextType.ApplicationDirectory实例的服务器和端口。 如果System.DirectoryServices.AccountManagement.ContextType.Domain上下文类型的名称为null,则此上下文是运行该线程的用户主体的域的域控制器。如果名称为null对于System.DirectoryServices.AccountManagement.ContextType.Machine上下文类型,这是本地计算机名称。对于System.DirectoryServices.AccountManagement.ContextType.ApplicationDirectory上下文类型,此参数不能为空。

这使我得出结论,因为我没有在name的构造函数中使用PrincipalContext属性,所以在我的开发机器上,域控制器将在我自己的主体下运行。这可能意味着它使用我的用户priveliges,当然这远远高于生产服务器运行的机器帐户。这反过来可以使Validate null的所有调用作为密码自动验证,因为更高的privelige水平。

至少,这是我的理论......欢迎提出意见和建议,我将尽快结束这个问题。

答案 1 :(得分:0)

听起来问题出现在代码中。对于要进行AD authed的用户,密码需要匹配。从AD生成安全令牌,如果没有正确的密码或伪造(也需要密码),则无法完成此操作。

代码是否使用SELECT user FROM users WHERE password LIKE '%password%'?我以前见过这个! :(

答案 2 :(得分:0)

为什么在调用ValidateCredentials之前不为密码添加空验证?另外,客户端身份验证也可能有所帮助。

答案 3 :(得分:0)

为什么不尝试

  1. 处理NULL参数异常。
  2. 首先检查两个凭据是否有值。

    using (var context = new PrincipalContext(ContextType.Domain))
    {
        if (string.IsNullOrEmpty(UserName) && string.IsNullOrEmpty(Password))
        {
           throw new ArgumentNullException();
           result = null;  // Or redirect to Login Page
        }
        else
        {
            result = context.ValidateCredentials(username, password);
        }
    }