Entwickler-Ecke
Windows API - Authentifizierung über Windows-Anmeldedaten
tacl - Do 22.07.10 10:36
Titel: Authentifizierung über Windows-Anmeldedaten
Hi Leute,
ich habe für mein Programm einen eigenen Anmeldemechanismus gebaut. Nun möchte ich eine automatische Anmeldung an mein Programm realisieren, wenn die Windows-Anmeldedaten einem Benutzerprofil in meinem Programm entsprechen.
Nun wäre meine Frage hierzu ob ein Abgleich von Anmeldedaten realisiert werden kann?
Das einfachste aus subjektiver Sicht wäre natürlich die aktuellen Windows Anmeldedaten samt Passwort auszulesen und gegen meine Zugangsdatenbank laufen zu lassen.
Objektiv fände ich es skandalös, wenn man das Passwort des aktuellen Windows-Users so ohne weiteres auslesen könnte.
Sinn hinter dieser Idee ist eigentlich die, dass die Rechner auf denen das Programm genutzt wird alle mit biometrischen Authentifizierungssystemen ausgestattet sind. Wenn die Anwender dann hinterher für das Programm doch ein Passwort eingeben müssen, ist das Käse...
Für Ideen (auch alternative Vorgehensweisen) wäre ich sehr dankbar.
Viele Grüße
Patrick
Moderiert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Do 22.07.2010 um 13:04
Gausi - Do 22.07.10 10:46
Wäre es nicht einfacher, wenn dein Programm die benutzerspezifischen Daten einfach im Userverzeichnis ablegt und von dort liest? Dann kannst du dir die Anmeldung komplett sparen - wenn sich ein User in Windows anmeldet, hat er Zugriff auf seine Daten/Einstellungen/Profil und bekommt von den anderen nichts mit.
Tastaro - Do 22.07.10 10:48
Wenn in deinem Programm die gleichen Benutzernamen wie in Windows hinterlegt sind, dann kannst du doch jedem Zugang gewähren, der sich erfolgreich an Windows angemeldet hat.
Beste Grüße
tacl - Do 22.07.10 10:53
Tastaro hat folgendes geschrieben : |
| Wenn in deinem Programm die gleichen Benutzernamen wie in Windows hinterlegt sind, dann kannst du doch jedem Zugang gewähren, der sich erfolgreich an Windows angemeldet hat. |
In diesem Fall würde ich mich komplett auf die Sicherheit des Netzwerks verlassen. Denn jeder, der dann in irgendeiner Form auf die Datenbank und das Programm zugreifen kann, kann drauf zugreifen.
---
Moderiert von
Narses: Beiträge zusammengefasst---
Gausi hat folgendes geschrieben : |
| Wäre es nicht einfacher, wenn dein Programm die benutzerspezifischen Daten einfach im Userverzeichnis ablegt und von dort liest? Dann kannst du dir die Anmeldung komplett sparen - wenn sich ein User in Windows anmeldet, hat er Zugriff auf seine Daten/Einstellungen/Profil und bekommt von den anderen nichts mit. |
Das würde vorraussetzen, dass jeder Benutzer immer an der selben Workstation arbeitet. Alternativ dazu müsste das Netzwerk so aufgebaut sein, dass sämtliche persönlichen Daten in der ActiveDirectory gespeichert werden. Das geht zwar, habe ich aber in der Realität noch nie gesehen.
Gausi - Do 22.07.10 11:06
Ok, damit kann man meine Idee dann schonmal vergessen. Wäre ja auch zu einfach gewesen. :P
tacl - Do 22.07.10 11:10
Gausi hat folgendes geschrieben : |
| Ok, damit kann man meine Idee dann schonmal vergessen. Wäre ja auch zu einfach gewesen. :P |
Trotzdem vielen Dank! :-)
---
Moderiert von
Narses: Beiträge zusammengefasst---
Danke für den Link. Grundsätzlich habe ich genau das gesucht.
Er läuft mir jedoch immer wieder in die Exception
Delphi-Quelltext
1:
| raise Exception.CreateFmt('Couldn''t query package info for NTLM, error %d\n', [ss]); |
ausgelöst in Zeile 445. Das Kurriose ist, dass er vor der Exception auf ss < 0 abfragt. ss ist jedoch 1242332.
Hast Du die Unit schon genutzt und evtl. auch das Problem?
Danke und Gruß
Patrick
Moderiert von
Narses: Delphi-Tags hinzugefügt
thepaine91 - Do 22.07.10 13:21
| Zitat: |
| Hast Du die Unit schon genutzt und evtl. auch das Problem? |
Die Frage ist gut. :D
tacl - Do 22.07.10 13:47
thepaine91 hat folgendes geschrieben : |
| Zitat: | | Hast Du die Unit schon genutzt und evtl. auch das Problem? |
Die Frage ist gut. :D |
Ok, die Satzstellung ist falsch, aber sonst?
Ist alles die antrainierte Delphi Syntax n'schuld. ;-)
Gausi - Do 22.07.10 13:50
Es geht wohl nicht um die Satzstellung sondern darum, dass
Luckie eine Unit auf seiner eigenen Seite verlinkt hat. Da ist die Wahrscheinlichkeit, dass er die schonmal benutzt hat, relativ groß. ;-)
Delete - Do 22.07.10 15:06
Also ich stelle nur Code auf meine Seite, den ich getestet habe und der bei mir funktioniert.
Leider verrät mir meine Glaskugel nicht unter welchen Windows der Fehler auftritt und ob beim Debuggen und mit welchem Delphi.
jaenicke - Do 22.07.10 21:15
tacl hat folgendes geschrieben : |
| ss ist jedoch 1242332. |
So hoch sollte eigentlich kein Error Code sein. :gruebel:
Sagt GetLastError vielleicht mehr?
Delete - Fr 23.07.10 09:16
tacl hat folgendes geschrieben : |
| ...Objektiv fände ich es skandalös, wenn man das Passwort des aktuellen Windows-Users so ohne weiteres auslesen könnte... |
X-Setup kann es auslesen...
Dezipaitor - Mi 28.07.10 00:47
Es geht einfacher:
Du erstellst eine Gruppe für Windows Benutzer, die sich in deinem Programm ohne Passwort anmelden können. Wenn z.B. der Benutzer Bob in der Gruppe DBUsers ist, dann kannst du deine Anmelderoutine in deinem Programm prüfen lassen, ob Bob in der Gruppe DBUsers ist (was er offensichtlich ist) und wenn ja, dann lässt du ihn ohne Passwort rein. So brauchst du die Passwörter nicht im Klartext.
Geht natürlich nur, wenn du das Passwort nicht noch für etwas anderes verwendest.
MarkusBauer - Sa 31.07.10 23:29
Schick Nutzernamen und Passwort aus deiner Datenbank durch eine solche Funktion:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function IsNTPasswordValid(Username: String; Password: String; Domain: String): Boolean; var token: THandle; begin LogonUser(PAnsiChar(Username), PAnsiChar(Domain), PAnsiChar(Password), LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_DEFAULT, token); CloseHandle(token); Result := token <> 0; end; |
Aufruf dann etwa so:
if IsNTPasswordValid(user,pass,'.') then...
Dann weißt du ob das Passwort aus deiner Datenbank mit dem Windowspasswort übereinstimmt. Setzt natürlich vorraus dass du die Passwörter so speicherst dass man sie rekonstruieren kann, wenn du MD5 o.ä. verwendest wird das nichts.
Getestet unter WinXP.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!