3

統合 Windows 認証を DirectorySearcher と組み合わせて使用​​して、イントラネット ユーザーを識別および認証しようとしています。

トリックを実行しているように見えるかなり単純なコードをなんとか取得できましたが、ライブサーバーで試してみると、次のエラーが発生しました。

「指定されたドメインが存在しないか、接続できませんでした」

ライブサーバーでアプリをデバッグできないため、古い開発サーバーにコピーしてそこでテストしました。アプリを正常に実行すると、同じエラーが発生したため、VSでデバッグを試みました....それ以外は完全に機能しました。

なりすましや LDAP 呼び出しに関係していると思われます。明らかに、デバッガーで機能する場合、実際の問題が何であるかを確認するのは困難です。

しかし、あなたたちの一人が私を正しい方向に向けることができると思いました.

私の認証クラスからのスニペット:

Private Function GetUserID() As String
    Dim sID As String = HttpContext.Current.User.Identity.Name
    Return Mid(sID, InStr(sID, "\") + 1)
End Function

Private Function GetDisplayName() As String
    Dim oSearcher As New DirectorySearcher
    Dim oResult As SearchResult
    Dim sName As String = String.Empty

    With oSearcher
        .Filter = String.Format("(SAMAccountName={0})", _UserID)
        .PropertiesToLoad.Add("displayName")
        oResult = .FindOne()
        If Not oResult Is Nothing Then
            sName = oResult.Properties("displayName")(0).ToString()
        End If
    End With

    Return sName
End Function
Private Function GetEmail() As String
    Dim oSearcher As New DirectorySearcher
    Dim oResult As SearchResult
    Dim sEmail As String = String.Empty

    With oSearcher
        .Filter = String.Format("(SAMAccountName={0})", _UserID)
        .PropertiesToLoad.Add("mail")
        oResult = .FindOne()
        If Not oResult Is Nothing Then
            sEmail = oResult.Properties("mail")(0).ToString()
        End If
    End With

    Return sEmail

End Function

Private Function GetGroups() As StringCollection
    Dim oSearcher As New DirectorySearcher
    Dim oResult As SearchResult
    Dim colGroups As New StringCollection
    Dim i As Int16

    With oSearcher
        .Filter = String.Format("(cn=" & _UserName & ")", _UserID)
        .PropertiesToLoad.Add("memberOf")
        oResult = .FindOne()

        If Not oResult Is Nothing Then
            Dim iGroupCount As Int16 = oResult.Properties("memberOf").Count

            For i = 0 To iGroupCount - 1
                colGroups.Add(oResult.Properties("memberOf")(i).ToString())
            Next

        End If
    End With

    Return colGroups
End Function
4

4 に答える 4

3

System.DirectoryServices.AccountManagement 名前空間をこの種のものに使用する方がはるかに簡単であることがわかりました。あなたの場合、UserPrincipal クラスはあなたの友達です。

Private Function GetEmail() As String
        Dim pc As PrincipalContext = new PrincipalContext(ContextType.Domain)
        Dim wi As WindowsIdentity = HttpContext.Current.User.Identity
        Dim up As UserPrincipal = UserPrincipal.FindByIdentity(pc, wi.Name)

        Return up.EmailAddress
End Function
于 2009-10-21T17:42:11.740 に答える
1

私はかつて同じ問題を抱えていましたが、エラーの原因はURLの書き方にあることがわかりました。

AD および ADSI を使用する場合は、「大文字」のパスを使用していることを確認してください。コードからわかるように、「cn」を小文字で書いています。【GetGroups関数】

私が試みる別の方法は、使用している「接続文字列」を適切に使用していることを確認することです。

LDAP://CN=" + ユーザー名 + ",OU=" + OU + ",OU=myOU,DC=myDC1,DC=myDC2";

になる

LDAP:// orgname .ad.root/CN=" + ユーザー名 + ",OU=" + OU + ",OU=myOU,DC=myDC1,DC=myDC2";

ここで、「orgname」は、AD が実行されているサーバー名です。

お役に立てれば。

于 2009-10-21T16:18:26.013 に答える
1

同じ機能を実現する別の方法を次に示します。

string fullPath = "LDAP://abc.xyz.com/DC=xyz, DC=com";
AuthenticationTypes authType = AuthenticationTypes.None;
DirectoryEntry verifiedUser = new DirectoryEntry(fullPath, txtUserName.Text.Trim(), txtPassword.Text.Trim(), authType);
verifiedUser.RefreshCache();
isAuthorisedUser = true;

これは私にとってはうまくいきました。

于 2012-01-18T22:08:26.150 に答える