2010-07-06 30 views
6

Estoy usando Active Directory para autenticar usuarios de un sitio de intranet. Me gustaría refinar los usuarios que están autenticados según el grupo en el que se encuentran en Active Directory. ¿Puede alguien mostrarme o indicarme las instrucciones sobre cómo encontrar los grupos en los que está un usuario en ASP.NET 4.0 (VB)?Buscar si el usuario es miembro de Active Directory Group ASP.NET VB?

Respuesta

3

He encontrado este here.

''' <summary> 
''' Function to return all the groups the user is a member od 
''' </summary> 
''' <param name="_path">Path to bind to the AD</param> 
''' <param name="username">Username of the user</param> 
''' <param name="password">password of the user</param> 
Private Function GetGroups(ByVal _path As String, ByVal username As String, _ 
       ByVal password As String) As Collection 
    Dim Groups As New Collection 
    Dim dirEntry As New _ 
     System.DirectoryServices.DirectoryEntry(_path, username, password) 
    Dim dirSearcher As New DirectorySearcher(dirEntry) 
    dirSearcher.Filter = String.Format("(sAMAccountName={0}))", username) 
    dirSearcher.PropertiesToLoad.Add("memberOf") 
    Dim propCount As Integer 
    Try 
     Dim dirSearchResults As SearchResult = dirSearcher.FindOne() 
     propCount = dirSearchResults.Properties("memberOf").Count 
     Dim dn As String 
     Dim equalsIndex As String 
     Dim commaIndex As String 
     For i As Integer = 0 To propCount - 1 
      dn = dirSearchResults.Properties("memberOf")(i) 
      equalsIndex = dn.IndexOf("=", 1) 
      commaIndex = dn.IndexOf(",", 1) 
      If equalsIndex = -1 Then 
       Return Nothing 
      End If 
      If Not Groups.Contains(dn.Substring((equalsIndex + 1), _ 
            (commaIndex - equalsIndex) - 1)) Then 
       Groups.Add(dn.Substring((equalsIndex + 1), & _ 
             (commaIndex - equalsIndex) - 1)) 
      End If 
     Next 
    Catch ex As Exception 
     If ex.GetType Is GetType(System.NullReferenceException) Then 
      MessageBox.Show("Selected user isn't a member of any groups " & _ 
          "at this time.", "No groups listed", _ 
          MessageBoxButtons.OK, MessageBoxIcon.Error) 
      'they are still a good user just does not 
      'have a "memberOf" attribute so it errors out. 
      'code to do something else here if you want 
     Else 
      MessageBox.Show(ex.Message.ToString, "Search Error", & _ 
MessageBoxButtons.OK, MessageBoxIcon.Error) 
     End If 
    End Try 
    Return Groups 
End Function 
End Class 
4

Para aquellos que puedan estar interesados, esto es como terminé de codificación que:

Dim ID As FormsIdentity = DirectCast(User.Identity, FormsIdentity) 
    Dim ticket As FormsAuthenticationTicket = ID.Ticket 
    Dim adTicketID As String = ticket.Name 
    Dim adSearch As New DirectorySearcher 
    adSearch.Filter = ("(userPrincipalName=" & adTicketID & ")") 
    Dim adResults = adSearch.FindOne.Path 
    Dim adResultsDirectory As New DirectoryEntry(adResults) 
    Dim found As Boolean = False 
    For Each entry In adResultsDirectory.Properties("memberOf") 
     Response.Write(entry) 
     Response.Write("<br/>") 
     If entry = "CN=GroupName,CN=UserGroup,DC=my,DC=domain,DC=com" Then 
      found = True 
     End If 

    Next 
    If Not (found) Then 
     Response.Redirect("login.aspx") 
    End If 
11

Soy consciente de que este post es bastante viejo, pero pensé que podría actualizarlo con los procesos que estoy usando. (ASP.Net 4.0, VB)

Si usa la seguridad integrada de Windows, en un dominio.

Page.User.IsInRole("domain\GroupName") comprobará si el usuario autenticado es miembro del grupo especificado.

Si desea comprobar la membresía de otro grupo de usuarios que no sea el usuario autenticado.

dos etapas para la comprobación de varios grupos con el mismo principal de usuario:

Dim MyPrincipal As New System.Security.Principal.WindowsPrincipal _ 
    (New System.Security.Principal.WindowsIdentity("UserID")) 
Dim blnValid1 As Boolean = MyPrincipal.IsInRole("domain\GroupName") 

de etapa única para el check un solo grupo:

Dim blnValid2 As Boolean = New System.Security.Principal.WindowsPrincipal _ 
    (New System.Security.Principal.WindowsIdentity("userID")).IsInRole("domain\GroupName") 

NOTA :: El método IsInRole funciona con grupos anidados. Si tiene un grupo de nivel superior con un subgrupo que es miembro, y el usuario es miembro del subgrupo.

5

creo que tengo la función última de conseguir todos los grupos de AD de un usuario incluyen grupos anidados sin recursión explícita:

importaciones System.Security.Principal

Private Function GetGroups(userName As String) As List(Of String) 
    Dim result As New List(Of String) 
    Dim wi As WindowsIdentity = New WindowsIdentity(userName) 

    For Each group As IdentityReference In wi.Groups 
     Try 
      result.Add(group.Translate(GetType(NTAccount)).ToString()) 
     Catch ex As Exception 
     End Try 
    Next 

    result.Sort() 
    Return result 
End Function 

Entonces sólo tiene que utilizar GetGroups ("ID de usuario "). Debido a que este enfoque usa el SID del usuario, no se realiza una llamada LDAP explícita. Si usa su propio nombre de usuario, usará las credenciales almacenadas en caché, por lo que esta función es muy rápida.

Try Catch es necesario porque en grandes empresas el AD es tan grande que algunos SID se pierden en el espacio.

0

Para sólo comprobar si un usuario es miembro de un grupo que incluye subgrupos sólo tiene que utilizar:

Public Function IsInGroup(ByVal objectName As String, groupName As String) As Boolean 
     Try 
      return New WindowsPrincipal(New WindowsIdentity(objectName)).IsInRole(groupName)) 
     Catch ex As Exception 
     End Try 

     Return False 
    End Function 
Cuestiones relacionadas