私はここ数時間、迷惑なActiveDirectoryビットで立ち往生しています。
私が達成しようとしているのは、LDAP overSSLを介してActiveDirectoryに接続することです。認証タイプは匿名です。 .NET Framework 4.0、C#、およびVisual Studio2010を使用しています。
次のコードは、さまざまなオンラインリソースに従って機能するはずです。しかし、それは驚くべき自明の「不明なエラー(0x80005000)」を思い付き続けます。
DirectoryEntry entry = new DirectoryEntry();
entry.Path = "LDAPS://some.ldap.server:636";
entry.AuthenticationType = AuthenticationTypes.SecureSocketsLayer;
DirectorySearcher searcher = new DirectorySearcher();
searcher.searchRoot = entry;
searcher.Filter = "(&(objectCategory=person)(objectClass=user))";
SearchResultCollection results = searcher.FindAll();
実行したい実際のクエリを、コードにあるクエリに簡略化しました。しかし、この一般的なクエリ(すべてのADで作業を返す必要がありますか?)を使用しても、エラーが返されます。
最後に!
ASP.NETアプリケーションには、信頼できる証明書ストアをマシンレベルで調べる権限がない(または方法がわからない)ようです。証明書が自己署名されているため、ASP.NETアプリケーションは接続の確立を拒否しました。
カスタム証明書の検証を使用して問題を修正しました。次のコードでうまくいきました。
LdapConnection con = new LdapConnection(new LdapDirectoryIdentifier("server", port));
con.SessionOptions.SecureSocketLayer = true;
con.SessionOptions.VerifyServerCertificate = new VerifyServerCertificateCallback(ServerCallback);
con.Credential = new NetworkCredential(String.Empty, String.Empty);
con.AuthType = AuthType.Basic;
con.Bind();
証明書が有効であると確信しているため、ServerCallBackメソッドは次のようになります。
public static bool ServerCallBack(LdapConnection connection, X509Certificate certificate)
{
return true;
}
ただし、もちろん、いつでもローカルマシンから証明書を取得して、検証することができます。
この例で使用されている名前空間は次のとおりです。
System.DirectoryServices.Protocols;
これは、名前空間が次の理由によるものです。
System.DirectoryServices.DirectoryEntry
カスタム証明書検証のメソッドは含まれていません。
あなたの助けと時間をありがとう、そしてうまくいけば、これは将来誰かを助けるでしょう!
私が覚えている限り、このエラーは、ディレクトリパス名に問題があることを意味します。
DirectoryEntry entry = new DirectoryEntry("LDAPS://srventr2.societe.fr:636/DC=societe,DC=fr", "user", "password");
DirectorySearcher searcher = new DirectorySearcher();
searcher.SearchRoot = entry;
searcher.SearchScope = SearchScope.Subtree;
searcher.Filter = "(&(objectCategory=person)(objectClass=user))";
SearchResultCollection results = searcher.FindAll();
ディレクトリサーバー(またはネットワーク上の要素の構成)によっては、このような単純な変更が機能する場合があります(LDAPとLDAPS、ただしポート番号はそのまま)
entry.Path = "LDAP://some.ldap.server:636";