2012-05-07 29 views
0

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

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 

答えて

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 
関連する問題