2012-02-27 12 views
3

私は2つのドメインを扱っています.1つは信頼できるドメインです。あるドメインにはJohnSmithがあり、もう1つのドメインにはJohnSmithが存在する可能性があります。これらの人はどちらも私のアプリケーションにログインする必要があります。Active Directory PrincipalContext.ValidateCredentialsドメインの曖昧さ回避

私の問題:どのドメインに渡しても問題ありません - このコードはtrueを返します! どのJohnSmithがログインしているかをどのように知ることができますか? userPrincipalName

static public bool CheckCredentials(
     string userName, string password, string domain) 
    { 
     using (var context = new PrincipalContext(ContextType.Domain, domain)) 
     { 
      return context.ValidateCredentials(userName, password); 
     } 
    } 

答えて

5

ValidateCredentials作品は、あなたはおそらく最初のパラメータ(ユーザー名)ログインと[email protected]対ユーザ名[email protected]を作成するためのドメインを組み合わせを構築しようとすることができます。

2

JPBlancの回答に基づいて、コードを書き直しました。私はまた、偽のドメインが渡された場合にはのtry/catchを追加しました。

static public bool CheckCredentials(
     string userName, string password, string domain) 
    { 
     string userPrincipalName = userName + "@" + domain + ".com"; 

     try 
     { 
      using (var context = new PrincipalContext(ContextType.Domain, domain)) 
      { 
       return context.ValidateCredentials(userPrincipalName, password); 
      } 
     } 
     catch // a bogus domain causes an LDAP error 
     { 
      return false; 
     } 
    } 
0

受け入れ答えは、その中に別の電子メールアドレスが含まれているドメインで失敗します。例:

userName = "employee"; 
domain = "company"; 
string userPrincipalName = userName + "@" + domain + ".com"; 

ドメイン間でユーザーを網羅する正しい方法は次のとおりです:.COM部分のない

string userPrincipalName = userName + "@" + domain; 

それは、ユーザを検索して答えが使用してfalseを返します

Domain = Company 

User1 = [email protected] (under company Domain) 

User2 = [email protected] (under company Domain) 

グローバルドメイン内の電子メールを検索する代わりに、そのドメインにあなたはログイン2人のユーザーを持つことはできません - あなたは、常にドメイン名を含むValidateCredentialsに後続の呼び出しに

UserPrincipal up = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, userName); 
up.UserPrincipalName // shows [email protected] 
up.DistinguishedName // shows CN=Surname,OU=group,DC=domain,DC=com 
up.SamAccountName // shows login name 

使用up.SamAccountNameを使用してログインしているユーザーの完全なDNを取得することができます

3

やっぱり同じsAMAccountNameを使って!

DistinguishedNameは、JohnSmithがログインしたことを確実に示します。