Найти, если пользователь является членом группы Active Directory ASP.NET VB? - PullRequest
6 голосов
/ 07 июля 2010

Я использую Active Directory для аутентификации пользователей на сайте интрасети.Я хотел бы уточнить пользователей, которые проходят проверку подлинности на основе группы, в которой они находятся в Active Directory.Может кто-нибудь показать мне или указать мне, как найти группы, в которые входит пользователь в ASP.NET 4.0 (VB)?

Ответы [ 5 ]

11 голосов
/ 25 января 2012

Я понимаю, что этот пост довольно старый, но я подумал, что могу обновить его с помощью процессов, которые я использую.(ASP.Net 4.0, VB)

При использовании встроенной защиты Windows в домене.

Page.User.IsInRole("domain\GroupName") проверит, является ли аутентифицированный пользователь членом указанной группы.

Если вы хотите проверить членство в группе других пользователей, кроме аутентифицированного пользователя.

Два этапа проверки нескольких групп с одним и тем же пользователем:

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

Одиночныйэтап для проверки в отдельной группе:

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

ПРИМЕЧАНИЕ :: Метод IsInRole работает с вложенными группами.Если у вас есть группа верхнего уровня с подгруппой, которая является участником, а пользователь является членом подгруппы.

5 голосов
/ 16 октября 2013

Я думаю, что у меня есть конечная функция для получения всех групп AD включенных вложенных групп пользователя без явной рекурсии:

Импортирует 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

Так что просто используйте GetGroups("Идентификатор пользователя").Поскольку этот подход использует SID пользователя, явный вызов LDAP не выполняется.Если вы используете свое собственное имя пользователя, оно будет использовать кэшированные учетные данные, поэтому эта функция очень быстрая.

Try Catch необходим, потому что в больших компаниях AD настолько велик, что некоторые SID теряются в пространстве.

4 голосов
/ 07 июля 2010

Для тех, кто может быть заинтересован, вот как я закончил кодировать его:

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
3 голосов
/ 07 июля 2010

Я нашел это здесь .

''' <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
0 голосов
/ 20 июля 2016

Чтобы просто проверить, является ли пользователь членом группы, включающей подгруппы, просто используйте:

    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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...