Skip to main content
 首页 » 编程设计

c#之针对 Active Directory 进行身份验证的 Web 服务的安全密码解决方案

2024年02月03日29thcjp

我正在修改的应用程序有一个 Web 服务,并且该 Web 方法中的一种 Web 方法用于根据事件目录对用户进行身份验证。因此,AuthenticateUser Web 方法调用的当前代码如下所示:

string domainAndUsername = aDomain + @"\\" + username; 
string ldsPath = buildLdsPath(searchBase); 
DirectoryEntry entry = new DirectoryEntry(ldsPath, domainAndUsername,  
    password); 
 
try 
{ 
    //Bind to the native AdsObject to force authentication. 
    object obj = entry.NativeObject; 
 
    DirectorySearcher search = new DirectorySearcher(entry); 
 
    search.Filter = "(sAMAccountName=" + username + ")"; 
    search.PropertiesToLoad.Add("cn"); 
    SearchResult result = search.FindOne(); 
 
    // more code to validate the result, etc... 
} 

当我开始查看这段代码时,首先让我担心的是 web 方法的参数如下所示:

[WebMethod] 
public ResultObj AddRole(string roleToAdd, string username, string password) 
{ 
    // code that calls above Authentication fragment... 
} 

因此,当向 service.asmx 页面发出请求时,当前的 Web 服务需要一个密码字符串,大概是通过网络以 XML 的形式以明文形式发送。

有没有人处理过这类问题?是否有我可以使用的替代 Active Directory 身份验证机制来避免必须传递纯文本密码?我自己想出的最佳选择是使用加密密码调用 WebMethod,并让另一端的代码对其进行解密。但是,我更喜欢更好的解决方案——例如:是否有某种方法可以使用单向哈希而不是密码来搜索 DirectoryEntry?

编辑:

其他详细信息:到目前为止,我还没有考虑过 SSL,因为这是我们公司内部的工具,所以它看起来有点矫枉过正,而且可能有问题(它将在公司内部网,对外不可见)。我什至担心发送纯文本密码的安全性的唯一原因是这些天即使在公司内部网上也存在越来越多的(可能是密码嗅探)恶意软件。

请您参考如下方法:

如果您有公钥/私钥组合,那么客户端可以使用公钥加密,而您使用私钥解密。

但是,这对客户端来说工作量太大,而且不是一种非常“网络方法”的方式。

由于您将用户名和密码作为参数发送,因此您应该求助于传输安全,基本上是 HTTPS,这要求您拥有从受信任的证书颁发机构颁发给您的公钥/私钥组合。


请注意,您将 SSL 加密 channel 与面向外部的网站关联起来是不正确的。想要加密 channel 的目的是防止中间人攻击,就像您在这里尝试做的那样。

您可以使用自行颁发的证书,但这需要在每台要调用您的网络方法的机器上安装证书的公钥。从受信任的权威机构获得一个更容易。