代码之家  ›  专栏  ›  技术社区  ›  Ogre Psalm33

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

  •  1
  • Ogre Psalm33  · 技术社区  · 15 年前

    我正在修改的应用程序有一个Web服务,其中一个Web方法用于根据Active Directory对用户进行身份验证。所以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...
    }
    

    因此,当前的Web服务可能需要一个密码字符串 发送到清除 当请求发送到service.asmx页面时,通过网络以XML形式发送。

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

    编辑:

    其他详细信息: 到目前为止,我还没有考虑到ssl,因为它是我们公司内部的一个工具,所以它看起来有点过分杀伤力,而且可能有问题(它将在公司内部网上运行,而不是在外部可见)。我甚至担心发送纯文本密码的安全性的唯一原因是,最近公司内部网络上出现的恶意软件(可能是密码嗅探)数量不断增加。

    5 回复  |  直到 15 年前
        1
  •  4
  •   casperOne    15 年前

    如果您有一个公钥/私钥组合,那么客户机可以用公钥加密,然后用私钥解密。

    但是,这对客户机来说太多工作了,而不是一种非常“web方法”的工作方式。

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


    应该注意的是,您的SSL加密通道与外部站点的关联是不正确的。想要加密一个通道的关键是防止中间人攻击,就像你在这里所做的那样。

    您可以使用自己颁发的证书,但这需要在每台要调用Web方法的计算机上安装证书的公钥。从可信的权威那里得到一个更容易。

        2
  •  1
  •   Mark Brackett Achilles Ram Nakirekanti    15 年前

    https(如前所述)是一个简单的选择。或者,您可以让IIS通过Digest或NTLM处理身份验证。你的应用仍然可以制定授权规则。NTLM是安全的,但它会损害您的互操作。否则,ad确实提供了一些摘要式身份验证方法,但我还没有使用它们测试代码。

    对于Server2000域,有一个“以可逆格式存储密码”选项,它允许域控制器计算密码的MD5哈希值,以便与显示的MD5哈希值进行比较。不过,MS意识到这有点安全问题,所以Server2003实现了“高级”摘要式身份验证——它预计算哈希值。

    LDAP登录应该选择MD5摘要作为身份验证类型,提供用户名,然后提供密码的MD5哈希。但是,普通的LDAP客户机可能希望MD5您自己的密码,因此您必须自己重写或创建它们。

        3
  •  0
  •   theG    15 年前

    我们把广告服务放在自己的网站上,解决了一个SSL证书问题。

        4
  •  0
  •   Ragoczy    15 年前

    我认为ssl或者ipsec可能是您最好的解决方案。

        5
  •  0
  •   Ogre Psalm33    15 年前

    对于我们的特定情况,由于客户机和Web服务都在我们公司的内部网上运行,一个可能对我们有用的解决方案是使用集成的Windows NTLM身份验证在客户机端处理身份验证,然后让客户机向Web服务提供凭据。客户代码如下:

    public void AddRole(string roleName)
    {
        webSvc.Credentials = CredentialCache.DefaultCredentials;
        // Invoke the WebMethod
        webSvc.AddRole(roleName);
    }
    

    Web方法现在将如下所示:

    [WebMethod]
    public ResultObj AddRole(string roleToAdd)
    {
        IIdentity identity = Thread.CurrentPrincipal.Identity;
        if (!identity.IsAuthenticated)
        {
            throw new UnauthorizedAccessException(
                    ConfigurationManager.AppSettings["NotAuthorizedErrorMsg"]);
        }
        // Remaining code to add role....
    }
    

    同样,我必须强调,只有当服务器信任客户机,并且两者都与同一个Active Directory服务器通信时,这个解决方案才可能工作。对于公共Web服务,给出的另一个答案将是更好的解决方案。

    有关更多信息,请参阅: