私は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"です。
だから私は、手動で、次のコードを使用してみました:
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);
問題を解決しました。
おかげで、私の同僚はそれをmisnamedている必要があります。それが違いをもたらすかどうか?とにかく、私はより詳細な質問を更新し、あなたが投稿したリンクをチェックします。 PS。ドメイン名にミスマッチがあるかもしれませんが、私は自分の会社のプライバシーを保護するため手動で入力しました。 – MSOACC
ブームは、あなたの助けに基づいて動作するようになった。私は作業コード/問題を解決して更新します。 – MSOACC
同様の問題だが、より簡単な解決法:) usernameで一致させるには、 'IdentityType.SamAccountName'を使う必要があります。 –