Frage

Ich verwende den folgenden Code auf Windows Vista Ultimate SP1 unsere Active Directory-Server abfragen, um den Benutzernamen und das Kennwort eines Benutzers auf einer Domain zu überprüfen.

public Object IsAuthenticated()
{
    String domainAndUsername = strDomain + "\\" + strUser;
    DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, strPass);
    SearchResult result;
    try
    {
        //Bind to the native AdsObject to force authentication.         

        DirectorySearcher search = new DirectorySearcher(entry) { Filter = ("(SAMAccountName=" + strUser + ")") };

        search.PropertiesToLoad.Add("givenName"); // First Name                
        search.PropertiesToLoad.Add("sn"); // Last Name
        search.PropertiesToLoad.Add("cn"); // Last Name

        result = search.FindOne();

        if (null == result)
        {
            return null;
        }

        //Update the new path to the user in the directory.
        _path = result.Path;
        _filterAttribute = (String)result.Properties["cn"][0];
    }
    catch (Exception ex)
    {
        return new Exception("Error authenticating user. " + ex.Message);
    }
    return user;
}

das Ziel mit .NET 3.5 und mit VS 2008 Standard

kompiliert

Ich bin unter einem Domänenkonto angemeldet, das ein Domain-Administrator ist, wo die Anwendung ausgeführt wird.

Der Code funktioniert perfekt in Windows XP; aber ich erhalte die folgende Ausnahme, wenn es auf Vista ausgeführt wird:

System.DirectoryServices.DirectoryServicesCOMException (0x8007052E): Logon failure: unknown user name or bad password.

   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
   at System.DirectoryServices.DirectorySearcher.FindOne()
   at Chain_Of_Custody.Classes.Authentication.LdapAuthentication.IsAuthenticated()
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectorySearcher.FindAll(Boolean findMoreThanOne)
   at System.DirectoryServices.DirectorySearcher.FindOne()
   at Chain_Of_Custody.Classes.Authentication.LdapAuthentication.IsAuthenticated()

Ich habe versucht, die Authentifizierungstypen zu ändern, ich bin nicht sicher, was los ist.


Siehe auch : Validate einen Benutzernamen und ein Passwort gegen Active Directory?

War es hilfreich?

Lösung

Wenn Sie mit .net 3.5 verwenden Sie stattdessen diesen Code.

Um einen Benutzer zu authentifizieren:

PrincipalContext adContext = new PrincipalContext(ContextType.Domain);

using (adContext)
{
     return adContext.ValidateCredentials(UserName, Password);
}

Wenn Sie den Benutzer R finden / W auf das Objekt führt dies tun:

PrincipalContext context = new PrincipalContext(ContextType.Domain);
UserPrincipal foundUser = 
    UserPrincipal.FindByIdentity(context, "jdoe");

Dies wird mit dem System.DirectoryServices.AccountManagement Namespace, so dass Sie es zu einem using-Anweisungen müssen hinzuzufügen.

Wenn Sie eine Userprincipal Objekt zu einem Directory Objekt konvertieren mit Legacy-Code zu arbeiten, können Sie dies tun:

DirectoryEntry userDE = (DirectoryEntry)foundUser.GetUnderlyingObject();

Andere Tipps

fand ich, dass gleicher Code auf mehreren Websites im Internet herumschwirren und es hat nicht für mich zu arbeiten. Steve Evans ist wahrscheinlich richtig, dass, wenn Sie auf .NET 3.5, sollten Sie nicht diesen Code verwenden. Aber wenn Sie noch auf .NET 2.0 sind, können Sie versuchen, diese zu Ihrem AD Dienst zur Authentifizierung:

DirectoryEntry entry = new DirectoryEntry("LDAP://" + domain, 
   userName, password, 
   AuthenticationTypes.Secure | AuthenticationTypes.SecureSocketsLayer);
object nativeObject = entry.NativeObject;

Die erste Zeile erstellt ein Directory-Objekt Domäne, Benutzername und Passwort. Es legt auch die AuthenticationTypes. Beachten Sie, wie ich bin die Einrichtung sowohl Secure (Kerberos) Authentifizierung und SSL mit dem „Bit-OR“ ( ‚|‘). Operator zwischen den beiden Parametern

Die zweite Zeile zwingt die Native von „Eintrag“ auf die AD-Dienste zu binden, die Informationen von der ersten Zeile verwendet wird.

Wenn eine Ausnahme ausgelöst wird, dann werden die Anmeldeinformationen (oder Einstellungen) waren schlecht. Wenn keine Ausnahme, sind Sie authentifiziert. Die Ausnahmemeldung wird in der Regel zeigen, was schief gelaufen ist.

Dieser Code ist ziemlich ähnlich zu dem, was Sie bereits haben, aber die Domäne verwendet wird, in dem Sie „Pfad“ haben und der Benutzername nicht mit der Domäne kombiniert. Seien Sie sicher, dass Ihre AuthenticationTypes richtig zu setzen, auch. Dies kann die Fähigkeit, Pause machen oder zu authentifizieren.

ich es herausgefunden sowieso Wenn Sie in der Domäne mit dem Benutzernamen auf Vista Geben Sie es nicht wie „Domäne \ Benutzer“ so nebenbei „Benutzer“ nur funktioniert scheint stattdessen in Ordnung zu arbeiten - außer Sie auf der gleichen Domäne sein müssen

Ist auf LDAP-Bindung erfordern erhöhte privs (UAC)? Sie könnten versuchen, Visual Studio und / oder die Anwendung als Administrator ausgeführt wird und sehen, ob das hilft. Wenn das ist das Problem könnte man immer ein Manifest für die Anwendung hinzufügen und es Höhe zu verlangen, dass die Art und Weise sie fragt, wenn ein Benutzer es ausgeführt wird.

Nicht sicher, warum wäre es erhöht privs erfordern, aber es ist ein Versuch wert.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top