我有一个基于C#和表单身份验证构建的Asp.net网站。我们使用Active Directory对用户进行身份验证,一切正常。但今天我们意识到只需输入用户名并点击登录即可登录任何帐户,无需提供任何密码!这只发生在localhost上运行的开发环境中(感谢上帝!),但我不喜欢它......
我之前从未见过这种行为,并且真的希望有人解释这是怎么发生的。这是Microsoft构建的开发人员功能吗?或者我的办公室有人在没有告诉其他人的情况下做了一个后门?我将进一步研究这最后一个选项,但在那之前 - 有没有人遇到过这个?
提前非常感谢!
修改 这是我输入的每个用户名的身份验证返回true的地方 - 密码为空。其他密码返回false。
using (var context = new PrincipalContext(ContextType.Domain))
{
result = context.ValidateCredentials(username, password);
}
PrincipalContext
是System.DirectoryServices.AccountManagement
答案 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)
为什么不尝试
首先检查两个凭据是否有值。
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);
}
}