6

ASP.NET Web サービスを Active Directory セットアップと統合し、それを使用してユーザーを認証し、メンバーである AD グループを確認し、カスタム アプリケーションを使用する権限があるかどうかを確認する際に問題が発生しています。

カスタム アプリケーションには独自のアクセス許可があり、管理者はカスタム アプリケーションの使用を許可する Active Directory グループを構成します。

私が抱えている問題は、別の信頼された AD フォレストのユーザーが完全な双方向信頼でログインしようとすると、ASP.NET Web サービスが通信する AD サーバーから彼のグループのリストを取得できないことです。ASP.NET Web サービスは、トラスト AD コントローラー (AD セカンダリ) ではなく、AD サーバー (AD メイン) にのみアクセスできます。

ユーザーは (AD セカンダリ) ドメインのメンバーであり、(AD メイン) ドメインに対してそのユーザーを認証できますが、ユーザーが (AD メイン) ドメインにいる場合、グループのリストを取得できません。 (AD セカンダリ) ドメイン。

このコードを試しました。

StringCollection groupids = new StringCollection();
try
{
    DirectoryLibrary dirLib = new DirectoryLibrary();
    DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://" + domain,username, password);   
    if (directoryEntry != null)
    {
        //Enum the properties so we can see what is in them
        foreach (string propname in directoryEntry.Properties.PropertyNames)
        {
            Debug.WriteLine(propname);
        }

        object obGroups = directoryEntry.Invoke("Groups");
        foreach (object ob in (IEnumerable)obGroups)
        {
        // Create object for each group.
            DirectoryEntry obGpEntry = new DirectoryEntry(ob);
            groupids.Add(obGpEntry.NativeGuid);
        }
    }
}
catch (DirectoryServicesCOMException ex) { throw ex; }

私は DirectoryEntry オブジェクトから離れて、このようなものに移行しようとしました。

List<GroupPrincipal> result = new List<GroupPrincipal>();
StringCollection groupids = new StringCollection();

PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain, domain, userName, password);

// find your user
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName);

// if found - grab its groups
if (user != null)
{
    PrincipalSearchResult<Principal> groups = user.GetGroups();

    // iterate over all groups
    foreach (Principal p in groups)
    {
        // make sure to add only group principals
        if (p is GroupPrincipal)
        {
            groupids.Add(p.DisplayName);
        }
    }

}

しかし、ユーザーを取得できず、他のドメインでそのユーザーのグループのリストを取得できません。どんな助けでも大歓迎です。

4

2 に答える 2

1

これは、AD 派生属性 memberOf の優れた使用例のようです。このDirectoryEntry directoryEntryオブジェクトを使用すると、ユーザーが属するグループを列挙できます。

foreach (object group in directoryEntry.Properties["memberOf"])
{
    DirectoryEntry obGpEntry = New DirectoryEntry("LDAP://" + (String)group);
    groupids.Add(obGpEntry.NativeGuid);
}

また、ob の前に「LDAP://」を付けると、最初のコード セグメントを使用できる可能性があります。

于 2012-04-10T15:06:42.660 に答える
0

リモート AD に接続して、必要なデータを取得する必要があると思います。

レプリケーションを一度書きました。ここで、多くの AD からレプリケートします。

それからのいくつかのコード:

Public Function GetDirectoryEntry() As Object

    If InStr(1, m_sLdapPath, "DC=") > 0 Then
      Dim directory_service As New PrincipalContext(ContextType.Domain, m_sDomain, m_sLdapPath)
      Return directory_service
    Else
      Dim directory_service As New PrincipalContext(ContextType.Machine, m_sDomain, m_sLdapPath)
      Return directory_service
    End If

  End Function

  Public Function GetUserList() As PrincipalSearchResult(Of Principal)

    Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext)
    Dim directory_user As New UserPrincipal(directory_service)

    Dim directory_userlist As New PrincipalSearcher(directory_user)
    directory_userlist.QueryFilter = directory_user
    Return directory_userlist.FindAll

  End Function

  Public Function GetGroupList() As PrincipalSearchResult(Of Principal)

    Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext)
    Dim directory_group As New GroupPrincipal(directory_service)

    Dim directory_grouplist As New PrincipalSearcher(directory_group)
    directory_grouplist.QueryFilter = directory_group
    Return directory_grouplist.FindAll

  End Function

これがまさにあなたが必要としているものではないことはわかっていますが、これは、任意の AD に接続してデータを取得する方法を示しています。私の場合、ユーザーリスト、グループリストなどを取得して、それらのコレクションを操作します。

Dim l_oGroupList As Object = oDirectory.GetGroupList()
For Each l_oGroup In l_oGroupList
  If l_oGroup.Members.Count > 0 Then
  If l_oGroup.Members.Contains(directory_service, IdentityType.UserPrincipalName, Username) Then
    ' he is part of the group
  End If
  End If
Next

これが問題を解決するのに少し役立つことを願っています...

于 2012-04-10T17:05:08.140 に答える