web-dev-qa-db-ja.com

LDAPS接続での不明なエラー(0x80005000)

私はここ数時間、迷惑な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で作業を返す必要がありますか?)を使用しても、エラーが返されます。

11
Rob Maas

最後に!

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

カスタム証明書検証のメソッドは含まれていません。

あなたの助けと時間をありがとう、そしてうまくいけば、これは将来誰かを助けるでしょう!

13
Rob Maas

私が覚えている限り、このエラーは、ディレクトリパス名に問題があることを意味します。

  1. 「server.domainName」がADサーバーの証明書のCNであることを確認してください。
  2. 「some.domainName」が適切に解決されていることを確認し、テスト用にhostsファイルに解決策を追加します
  3. 「domainName」が適切に解決されていることを確認し、テスト用にhostsファイルに解決策を追加します
  4. サーバー証明書を発行する認証局の公開鍵が、コンピューターの信頼されたルート証明機関ストアにあることを確認してください。
  5. このようにしてみてください:

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(); 
2
JPBlanc

ディレクトリサーバー(またはネットワーク上の要素の構成)によっては、このような単純な変更が機能する場合があります(LDAPとLDAPS、ただしポート番号はそのまま)

entry.Path = "LDAP://some.ldap.server:636";
1
curtisk