3

AD データベースからユーザーのグループを取得するための PrincipalContext オブジェクトを作成しています (これらを使用して、サイトのさまざまな部分への認証を行います)。

これは以前はフォーム認証を使用して行われていたため、コードは次のようになりました。

PrincipalContext pc =
    new PrincipalContext(ContextType.Domain, "domain.com", username, password);

UserPrincipal usp =
    UserPrincipal.FindByIdentity(pc, IdentityType.Guid, user.Guid.ToString());

foreach (var group in usp.GetGroups())
{
    // Add group to collection
}

しかし、最近 Windows 認証に切り替えたため、ユーザーのパスワードにアクセスできなくなりました。

現在のユーザーの資格情報を使用して AD データベースを検索するにはどうすればよいですか? An operations error occurred偽装を使用してみましたが、行にエラーがスローされますFindByIdentity。認証をすべて忘れると、返されるグループの数が制限されます。

4

2 に答える 2

6

これが私が使用するメソッドです。コレクションを返すように変更できます。

public static List<string> getGrps(string userName)          
{          
    List<string> grps = new List<string>();          

    try          
    {
        var currentUser = UserPrincipal.Current;
        RevertToSelf();             
        PrincipalSearchResult<Principal> groups = currentUser.GetGroups();          
        IEnumerable<string> groupNames = groups.Select(x => x.SamAccountName);          
        foreach (var name in groupNames)          
        {          
            grps.Add(name.ToString());          
        }          
        return grps;          
    }          
    catch (Exception ex)          
    {          
        // Logging         
    }          
} 

ここで行ったのは、IEnumerable の結果が必要であると想定しています。

于 2013-01-18T21:15:07.077 に答える
0

アノンの答えは私が尋ねたことに対して機能しますが、他のユーザーのグループも検索できるようにしたかったのです。これを行うために私が見つけた最善の方法は、サービス アカウントで asp.net プログラムのアプリ プールを実行し、元のコードを使用することです。

IIS マネージャー 7.5 でこれを行うには、[アプリケーション プール] に移動し、アプリが実行されているプールを右クリックして [詳細設定] を選択し、ID を "ApplicationPoolIdentity" からカスタム ドメイン アカウントに変更します。

于 2013-01-22T17:11:48.393 に答える