2012-06-06 89 views
5

最初に、私はSOの質問のほとんどを見てきましたが、まったく同じ問題ではないようです。 Hereも同様の質問ですが、全く同じではありません。私の状況では、次のようにPrincipalContextを作成しています。PrincipalContext.ValidateCredentials極端に遅い

Dim pctx As PrincipalContext = New PrincipalContext(ContextType.Domain, fullyqualifieddomain, container, ADUserID, ADPassword) 


    If pctx.ValidateCredentials(userName, password) Then 

ADUserIDはサービスアカウントです。

この方法は機能しますが、6-10秒以上かかることがあります。

また、基礎となるディレクトリエントリを取得して直接バインドすることも試みました。これははるかに高速で、私のマシン(ドメイン外)には動作しますが、ドメイン内にあるWebサーバー上では動作しません。これは、DirectoryEntry.NativeObject呼び出しで失敗します。どうしてか分かりません。残念ながら、私は、動作している唯一の方法が実現するには遅すぎる状況にあります。これをスピードアップする方法はありますか?

ありがとうございます!

+0

Webサーバーで、PrincipalContext.ValidateCredentialsメソッドを使用して、すべてがゆっくりと認証できることを確認しましたか? – Peter

+0

はい、それは痛いほど遅いです。有効な資格情報には6〜10秒かかりますが、無効な資格情報には2倍の時間がかかります。 –

答えて

9

下記のコードを試してください。それは速くないかもしれませんが、それがうまくいくかどうかを見てうれしいでしょう。

ユーザー名は、ドメインを含まないようにする必要があります。私のテストでは、ちょうど短い名前 "DOMAIN"を使用しました.DNではなく、完全修飾されたものでもあります。

System.DirectoryServices.Protocolsへの参照を追加します。

using System.DirectoryServices.Protocols; 

public static bool Authenticate(string username, string password, string domain) 
{ 
    try 
    { 
     //string userdn; 
     using (LdapConnection lconn = new LdapConnection(new LdapDirectoryIdentifier(domain))) 
     { 
      lconn.Bind(new System.Net.NetworkCredential(username, password, domain)); 
      return true; 
     } 
    } 
    catch (LdapException e) 
    { 
     return false; 
    } 
} 

if (Authenticate("username", "password", "domain")) { } 
+0

私はこれを試してみましょう、あなたに知らせてください。私は明日まで機会を得られません。ありがとう! –

+0

さて、私はついにこれを試してみました。これは私が以前に試みた2つの方法(通常は1秒未満)よりも高速です。このクラス/名前空間についてMSDNで読んでいくつもりです。ありがとう。 –

関連する問題