2016-05-05 19 views
3

私はLdapAuthenticationを使用してユーザーをActive Directoryに記録しています。ユーザーが所属するすべてのグループを検索したい私は、次のコードを使用しています:UserPrincipal.FindByIdentity()は常にnullを返します

string adPath = "LDAP://OU=HR Controlled Users,OU=All Users,DC=myDomain,DC=local"; 
LdapAuthentication adAuth = new LdapAuthentication(adPath); 
try 
{ 
    if (true == adAuth.IsAuthenticated("myDomain", txtLoginEmail.Text, txtLoginPassword.Text)) 
    { 
     string email = txtLoginEmail.Text; 

     using (PrincipalContext context = new PrincipalContext(ContextType.Domain)) 
     { 
      UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, email); 
      foreach (var group in user.GetGroups()) 
      { 
       Console.WriteLine(group.Name); 
      } 
     } 
    } 
} 
catch(Exception e) { /* Handle Error */ } 

私の問題は、私はUserPrincipal.FindByIdentityを呼び出すとき()私は常にnull値を得ることである、意図したとおりにユーザー認証が機能するにもかかわらず。

どうしてですか?コードや私のアプローチに問題はありますか?これは、ASP.NET 4.0 WebFormsアプリケーション内で実行されています。

更新:

は、どうやら私は間違ったIdentityType(CN)を使用してきました。私はデバッグでチェックし、アカウントの名前は "UserA"です。

enter image description here

だから私は、手動で、次のコードを使用してみました:

UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.Name, "UserA"); 

しかし、それでもまだ、私はnullを取得します。

アップデート2(解決):

は問題が2倍でした。 PrincipalContextを宣言するときに、ドメインコントローラの名前を指定する必要がありました。その後

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, "myDomain")) 
{ 
    // code here... 
} 

、私は間違っIdentityTypeを使用していたUserPrincipalを検索するときに、 IdentityType.SamAccountName(ユーザー名)ではなく、IdentityType.Name(アカウントの名前)で検索していました。

UserPrincipal user = UserPrincipal.FindByIdentity(context, IdentityType.SamAccountName, email); 

問題を解決しました。

答えて

6

IdentityType.Nameを使用すると、渡す値がアカウント名(cn属性)であることがわかります。ユーザー名(sAMAccountName atrribute)で一致させる場合は、IdentityType.SamAccountNameに合格する必要があります。


旧答え: しかし、あなたはそれを電子メールアドレスを送信しているように見えます。だからそれは本当に常に何も返されません。

ADは電子メールアドレスを一意の識別子と見なさないため、FindByIdentityに電子メールアドレスを使用することはできません。ここで

は、電子メールアドレスで検索する方法の例です:ラベルは、実際のメールアドレスではありませんユーザー名であること:)対応するためのhttp://doogalbellend.blogspot.ca/2012/03/finding-userprincipal-for-email-address.html

+0

おかげで、私の同僚はそれをmisnamedている必要があります。それが違いをもたらすかどうか?とにかく、私はより詳細な質問を更新し、あなたが投稿したリンクをチェックします。 PS。ドメイン名にミスマッチがあるかもしれませんが、私は自分の会社のプライバシーを保護するため手動で入力しました。 – MSOACC

+0

ブームは、あなたの助けに基づいて動作するようになった。私は作業コード/問題を解決して更新します。 – MSOACC

+0

同様の問題だが、より簡単な解決法:) usernameで一致させるには、 'IdentityType.SamAccountName'を使う必要があります。 –

関連する問題