通过userCertificate属性使用证书查询LDAP

时间:2014-08-26 22:15:00

标签: c# ldap adlds

我获得的证书为byte[],例如:

byte[] certRaw;
X509certificate2 x509Cert = new x509Certificate2(Request.ClientCertificate.Certificate);
certRaw = x509Cert.GetRawCertData();

然后我试图通过该值在LDAP中查找用户。

DirectorySearcher finduser = new DirectorySearcher(ldapconnection);
findUser.Filter = "(&(objectClass=user)(userCertificate=" + certRaw + "))";

这与LDAP中的userCertificate不匹配。 如果我从证书中取出并使用它而不是userCertificate属性,我可以通过CN查找用户,但这不是我给出的要求。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:0)

我被问到同样的事情!

好吧,我被问及"当我拥有的证书是证书时,我怎么能通过针对他们发布的证书在Active Directory中找到用户,并且证书并不一定让用户“#其中的主题名称可能与任何内容不一致"。所以:足够接近。

我把你的问题和另一个答案放在一起,得到的东西看起来很有效。

通常的免责声明适用不要这样做 ......这可能会削弱你的DC,或者是轻微的致癌物质。不知道它是如何或是否适用于填充到userCertificate中的多个证书,因此在这种情况下可能需要修改查询。

要运行此功能,您需要一个您正在搜索的证书的.CER文件。那就是

FindUserWithCert mycert.CER 

你离开了。

using System;
using System.Security.Cryptography;
using System.Security.Cryptography.X509Certificates;
using System.DirectoryServices;

/// This is sample code only so please enjoy it with all care
/// and no responsibility :) 
/// 
namespace FindUserWithCert
{
    class Program

    {
        static void Main(string[] args)
        {
            byte[] certRaw; 
            X509Certificate2 x509Cert = new X509Certificate2(args[0]); 
            certRaw = x509Cert.GetRawCertData();

            string certBytes = "";

            foreach (byte b in certRaw){
                certBytes += String.Format("\\{0:X}", b);
                //Console.Write (String.Format("\\{0:X}",b));
            }

            DirectorySearcher findUser = new DirectorySearcher("(&(objectClass=user)(userCertificate=" + certBytes + "))");

            foreach (System.DirectoryServices.SearchResult thing in findUser.FindAll())
            {
                Console.WriteLine(thing.Path.ToString());
            }

        }
    }
}