2012-04-03 221 views
11

迷惑なActive Directoryのビットについて、私はここ数時間前から立ち往生しています。LDAPS接続で不明なエラー(0x80005000)がありました

私が達成しようとしているのは、SSL経由でLDAP経由でActive Directoryに接続することです。認証タイプは匿名です。私は.NET Framework 4.0、C#、Visual Studio 2010を使用しています。

次のコードは、さまざまなオンラインリソースに従って動作するはずです。しかし、「Unknown Error(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の仕事を返す必要がありますか?)では、エラーを返します。

+1

「認証タイプは匿名です。」そうではなく、AuthenticationTypes.SecureSocketsLayerに設定します。送信者を識別するので、Username + Passwordも設定するのがよいでしょう。 –

+0

こんにちはハンス 私は** JXplorer **というツールを使ってADに接続しようとしました。 SSLに設定されていて、ユーザー名やパスワードが指定されていないとうまくいきました。 –

+0

さて、ボールを見てください。有効なユーザーを指定してもE_FAILを取得できますか? AuthenticationTypes.Anonymousを指定すると動作しますか? JXplorerが匿名に戻ったり、ユーザーが指定されていないときにログインしているユーザーの資格情報を使用したりするようなことは、自由に行えます。 –

答えて

13

最後に!

マシンレベルで信頼できる証明書ストアを調べる権限が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 

は、カスタム証明書の検証のための方法が含まれていません。

お手数をおかけしていただきありがとうございます。将来的にはこれが誰かを助けることでしょう。

+1

+1また、私がここに来る人のために追加するのは、あなたがLDAPサーバに接続するために信用を必要としないことを確認することです。また、ldapを照会するには、SearchRequestクラスとSearchResponseクラスを使用する必要があります。SearchResponseにはソートがありませんので、独自に実装する必要があります。私はカスタム証明書検証のb/cを使用していませんでしたが、 'DirectoryEntry'はWinPEで失敗していましたが、理由はわかりません... – MDMoore313

+0

マシンストアのcertにアクセスするasp.net権限を与えることができますマシンストアの証明書mmcスナップインを開き、使用する証明書を探して、右クリック>タスク>秘密鍵を管理し、ネットワークサービスを許可してください。これは証明書を使用するもの、例えばアイデンティティ・ファンデーションなどの場合に便利です –

+0

私は今日あなたの答えを見つけました。私は同じ問題を抱えていました。 スローされた例外は直感的ではなく、この解決策を見つけるのに多くの時間を浪費します。 この投稿は非常にユーザーフレンドリー、+1またはコースです。 –

2

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

  1. 「server.domainName」は、ADサーバーの証明書のCNであることを確認してください。
  2. は「some.domainName」も
  3. は「domainNameは」うまくテスト
  4. 用のファイル、あなたのホストで解像度を追加する解決されたことを確認し、テスト用のファイル、あなたのホストで解像度を追加する解決されていることを確認してくださいサーバー証明書を発行する認証局の公開キーが、コンピューターの信頼されたルート証明機関ストアにあることを確認します。
  5. このようにやってみてください:、LDAPS対LDAP(時にはこのような単純な変更が動作するディレクトリサーバー(またはネットワーク上の要素が設定されている)方法によっては

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(); 
+0

こんにちは、同じWindowsサーバーマシンで実行すると、コードはerrosなしで動作します。しかし、私はリモートマシンからDirectoryEntryで作業する必要があります。この場合は動作しません。私がする必要がある他の変更? –

+1

「うまくいきません」は、あなたを助けるだけでは不十分です。 – JPBlanc

+0

お詫び申し上げます。リモートマシンで同じコードを実行していて、例外メッセージとして「Server is not operational」が表示されます。私は未亡人のサーバー証明書がリモートマシンで検証されていないことを発見しました。 'LdapConnection' APIを使用して証明書を検証するために、コードはこの "post、http://stackoverflow.com/questions/12621256/connect-to-open-ldap-over-ssl"にあります。私の要件は、証明書を検証し、あなたのような "DirectoryEntry" APIを使用する必要があることです。 –

1

ポート番号を残してください)

entry.Path = "LDAP://some.ldap.server:636"; 
+0

いいえ。それは動作しません –

+1

それは私に役立ちましたが、そのような振る舞いを引き起こすその特定のAD構成が何であるかはわかりません。また、もう一つ興味深いのは、URLに小文字のldapプロトコル名を指定した場合、 "LDAP://some.ldap.server:636"が動作しますが、 "ldap://some.ldap.server :636 "はしません。私はこれを特に気にかけてしまった。 – RBT

+0

また、DirectoryEntryオブジェクトのAuthenticationTypeプロパティをAuthenticationTypes.SecureSocketsLayerに設定せずに私のために働いていましたが、これでもすべての環境とトポロジで一貫性があるかどうかはわかりません。 – RBT

関連する問題