0

OID を介して複数の Web アプリケーションに SSO を提供するために構築された、非常に広範なアプリケーションがあります。問題は、一部のユーザーがアプリケーションの 1 つのロールで「孤立」するのを見たことです。そのロールにアクセスできるすべてのユーザーの識別名を返すメソッドを作成しました。クリーンアップを実行するために、前の手順で返されたユーザーが実際に OID に存在することを確認しようとしています。ユーザーまたはロールを検索するときに System.DirectoryServices.Protocols.SearchRequest クラスを使用していますが、識別名では機能しません。以下は私の方法です。機能させるためにさまざまな方法を試すために、数回変更されました。

    Public Function GetUserByDN(UserDN As String) As SearchResultEntry
        Dim searchString As String = String.Format("baseDN={0}", UserDN)
        Dim containerDN As String = Nothing
        If _extranet Then
            containerDN = "cn=users," & ConfigurationManager.AppSettings("Directory_ExternalDomain")
        Else
            containerDN = "cn=users," & ConfigurationManager.AppSettings("Directory_InternalDomain")
        End If

        Dim attributes(14) As String
        attributes(0) = DIRECTORY_UNIQUE_ID
        attributes(1) = DIRECTORY_FIRST_NAME
        attributes(2) = DIRECTORY_LAST_NAME
        attributes(3) = DIRECTORY_EMAIL_ADDRESS
        attributes(4) = DIRECTORY_TELEPHONE
        attributes(5) = DIRECTORY_STREET
        attributes(6) = DIRECTORY_CITY
        attributes(7) = DIRECTORY_STATE
        attributes(8) = DIRECTORY_ZIP
        attributes(9) = DIRECTORY_CUSTOMER_NAME
        attributes(10) = DIRECTORY_ENABLED
        attributes(11) = DIRECTORY_GIVEN_NAME   ' this is the first name for a domain user
        attributes(12) = DIRECTORY_KBIT_INDICATOR
        attributes(13) = DIRECTORY_REQUESTING_BRANCH
        attributes(14) = DIRECTORY_PWD_MUST_CHANGE

        'Me.Connection.Bind()
        Me.Bind()

        Dim myRequest As New System.DirectoryServices.Protocols.SearchRequest(containerDN, UserDN, SearchScope.Base, attributes)
        Dim myResponse As SearchResponse = Me.Connection.SendRequest(myRequest)
        Dim results As SearchResultEntryCollection = myResponse.Entries

        If results.Count >= 1 Then
            Return results(0)
        Else
            Return Nothing
        End If
    End Function
4

1 に答える 1

0

これに対する答えを見つけるには、多くの調査と質問が必要です。ユーザーの OU を調べてユーザーの DN を検索する代わりに、ユーザーの DN を調べて単純な LDAP クエリを実行するだけでよいことがわかりました。これが私の最終的な解決策です。これがコミュニティに役立つことを願っています。

       Public Function GetUserByDN(UserDN As String) As SearchResultEntry
        Dim ldapFilter As String = "(objectClass=person)"

        Dim attributes(14) As String
        attributes(0) = DIRECTORY_UNIQUE_ID
        attributes(1) = DIRECTORY_FIRST_NAME
        attributes(2) = DIRECTORY_LAST_NAME
        attributes(3) = DIRECTORY_EMAIL_ADDRESS
        attributes(4) = DIRECTORY_TELEPHONE
        attributes(5) = DIRECTORY_STREET
        attributes(6) = DIRECTORY_CITY
        attributes(7) = DIRECTORY_STATE
        attributes(8) = DIRECTORY_ZIP
        attributes(9) = DIRECTORY_CUSTOMER_NAME
        attributes(10) = DIRECTORY_ENABLED
        attributes(11) = DIRECTORY_GIVEN_NAME
        attributes(12) = DIRECTORY_KBIT_INDICATOR
        attributes(13) = DIRECTORY_REQUESTING_BRANCH
        attributes(14) = DIRECTORY_PWD_MUST_CHANGE

        Me.Bind()

        Dim myRequest As New SearchRequest(UserDN, ldapFilter, SearchScope.Base, attributes)
        Dim myResponse As SearchResponse = Me.Connection.SendRequest(myRequest)

        If myResponse.Entries.Count >= 1 Then
            Return myResponse.Entries(0)
        Else
            Return Nothing
        End If
    End Function
于 2012-05-09T16:35:54.223 に答える