使用证书按userCertificate属性查询LDAP

本文关键字:属性 查询 LDAP userCertificate 证书 | 更新日期: 2023-09-27 18:19:41

我正在以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。如果我从证书中获取CN并使用它而不是userCertificate属性,我可以通过CN查找用户,但这不是我的要求。感谢您的帮助。

使用证书按userCertificate属性查询LDAP

有人问我同样的问题!

嗯,有人问我"当我只有证书,而证书中不一定有用户的使用者名称,而且可能与任何内容都不一致时,我如何通过针对他们发布的证书在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());
            }
        }
    }
}