Hi Leute,
ich möchte meine Anwendung um das Single Sign-On erweitern, sodass keine Anmeldung an meiner Software notwendig ist (also die Login-Daten von Windows benutzt werden bzw. die Authentifizierung von Windows ausreicht).
Ich habe aber leider keinen Anhaltspunkt, Idee wie ich das Umsetzen kann/soll. Mir währe es sehr wichtig, dass dies nicht nur auf einem Klient funktioniert, sondern auch innerhalb einer Domäne (also die Login-Daten aus dem Domänen-Kontroller!).
Meine bisherigen Recherchen, endeten immer bei Web- und Java-Lösungen, aber ich fand einfach keine Beispiele etc. wie man das mit Hilfe von nativem C++ erledigen kann. (ThirdParty?, LDAP etc.?).
Ich freue mich über jede Idee und möglichkeit 
Gruß
RudolfG
Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL
Hi Steiner_B,
vielen Dank für die Antwort, aber ich habe einige Fragen dazu 

Zitat von
Steiner_B
Die einfachste Lösung die wir damals ausgegraben haben ist mittels LDAP und der Libary von
www.openldap.org gewesen.
Das damalige System war basierend auf Windows 2003 Server.
Und wie konntet ihr LDAP nutzen um an die Authentifikation des Domänkontrollers dran zu kommen? Kann man das per LDAP-Abfragen im Active-Directory machen (wenn ja würde ich mich sehr über eine ausführliche Antwort, wie es genau funktioniert, freuen!)?
Gruß
RudolfG
Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

Zitat von
Steiner_B
Meinst du wie du überprüfen kannst welcher Benutzer gerade angemeldet ist?
genau, sry für die unverständliche Frage
Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

Zitat von
Steiner_B
In der winbase.h gibts eine Funktion getUserName() wenn ich mich recht erinnere
Danke, aber wofür benötige ich jetzt LDAP bzw. wofür habt ihr es damals benötigt (um zu überprüfen ob dieser Benutzer im Active Directory ist?)?
Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

Zitat von
Steiner_B
Wir haben damals mehrere Sachen damit gemacht.
1. Überprüft ob Benutzername + Passwort überhaupt ein gültiger Domain-Login ist.
Das heißt, das bei euch der Benutzer zuerst sein Benutzernamen und das Passwort eingeben musste, oder woher habt ihr diese Informationen genommen? Ungefähr so etwas brauche ich auch, wobei der Anwender die Daten nicht eingeben soll, sondern hier eine Überprüfung notwendig ist ob die aktuelle Anmeldung eine gültige/erfolgreichen Domain-Anmeldung ist.

Zitat von
Steiner_B
2. Die Gruppen geladen welchen der Benutzer angehört, da über diese unsere Rechte in der Applikation verwaltet waren.
Das ist im Moment nicht meine Aufgabe, allerdings soll ich das Authentifizieren so entwickeln, dass diese Möglichkeit möglichst einfach umgesetzt werden kann. Also das ich schon mal die GUID oder so des Benutzers habe um so einfacher die Gruppe abzufragen etc.. Als nächstes steht mir die Rechteverwaltung auf Basis der Gruppenrichtlinien/Administrative Vorlagen bevor und ich möchte gerne einen einheitlichen Weg/ein einheitliches Verfahren benutzen.

Zitat von
Steiner_B
Soweit ich deinen Aufgabe verstehe geht es bei dir eh nur darum festzustellen ob der Benutzer in der Domain vorhanden ist? Oder darf nicht jeder Benutzer der Domain auf das Programm zugreifen? Erklär mal bitte etwas genauer was du erreichen möchtest.
Also es geht für mich erstmal einen möglichst guten/sinnvollen Weg für das Handhaben des SSO's unter Windows zu finden. Da als nächstes die Rechteverwaltung dran ist und diese auf Basis von Administrativen-Vorlagen (im Active Directory) und den Gruppenrichtlinen erfolgen soll, dachte ich, dass ich das am besten irgendwie mit Active-Directory machen sollte.
Eine Idee dieses SSO (ohne das AD) zu verwirklichen war die folgende:
----------------------------------------------------------------------
Also ich habe es wie folgt angedacht:
Das ist die Tabelle in der Datenbank in der Benutzer der Software verwaltet werden:
sys_users
{
id,
sign, // Login-Kürzel
pw char(40), // Hash, es muss nämlich für Kunden die, die keine Windows-Authentifizierung möchten, möglich sein eigene Passwörter zu hinterlegen!
windows_login bool, // Windows-Athentifizierung benutzen?
domain // aus welcher Domäne darf sich der Benutzer mit dem Benutzernamen aus der Spalte sign anmelden. (Wird nur für die automatische Windows-Authentifizierung benötigt!)
}
Bei dem Start der Software wird der Windows-Benutzername ausgelesen, der passende Benutzerdatensatz aus der Tabelle, durch das vergleichen des Benutzernamens mit der Spalte "sign", gesucht. Wird kein Eintrag gefunden oder die spalte windows_login bei diesem Datensatz hat "false", kommt der Anwendungseigene Login-Dialog der die Identität durch vergleichen der Eingabe und des Passworts bestätigt oder auch nicht.
Sollte ein Eintrag zu dem aktuellen Windows-Benutzernamen gefunden werden und da in der Spalte windows_login true stehen, sollte jetzt überprüft werden ob die Domäne des aktuellen Windows-Benutzers mit dem Eintrag in der Spalte "domain" übereinstimmt. Ist das der Fall, wird die Software als dieser Benutzer gestartet, ist das nicht der Fall bekommt der Benutzer eine Fehlermeldung und hat die Möglichkeit sich durch das "manuelle" Login anzumelden.
.--------------------------------------------------------------
In dieser Idee werden alle Informationen einmal in der AD und einmal in meiner Software verwaltet, was zu einer doppelten Pflege der Benutzer/Gruppen und nachher auch Rechte führen würde. Dies ist natürlich keinen Kunden zuzumuten, deswegen suche ich nach einer Möglichkeit möglichst viele Informationen (und darunter auch die Authentifizierung ob der Benutzer die Software starten darf und auch als wer er die Software startet) aus dem Active-Directory auszulesen damit man nachher eine einfachere Rechteverwaltung hinbekommen kann.
Bei der Variante mit dem AD stehe ich aber vor einem Problem, was mache ich wenn der Kunde kein Windows-Server (und somit kein AD) hat, sondern die Software als Einzelplatz benutzen möchte? Muss ich hier dann alternativen in form von XML, INI oder sonstigen Schaffen?
Hoffe das diese Informationen hilfreicher sind, mein Problem nachzuvollziehen.
@Steiner_B: Danke für die bisherige Antworten, die haben mir aufgezeigt, dass ich überhaupt noch viele grundlegende Fragen/Antworten finden muss. Ich würde mich sehr freuen wenn wir diese zusammen finden könnten 
Gruß
RudolfG
Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

Zitat von
Steiner_B
Heißt das das deine Benutzer bis jetzt Passwort und Benutzernamen eingeben mussten?
Für die Identifikation im Programm selber, hier konnten Benutzer eigene Benutzernamen und Passwörter völlig unabhängig von den Windowsbenutzernamen und Passwörtern eintragen und auf diese wurde beim Programmstart geprüft.
Dies sollte verhindert werden wenn die "Windows-Anmeldung benutzen?" aktiviert wird, indem der aktuelle Windows-Benutzername mit dem Benutzernamen in der Datenbank verglichen wird und somit gesagt werden kann, dass der Windows-Benutzer "rudolf" der Anwendungsbenutzer "rudolf" mit der ID = 25 ist (diese Id wird dann intern benötigt um Einträge in anderen Tabellen einzutragen etc.).

Zitat von
Steiner_B
Wenn man nichts eingeben soll wird sicher das Hauptproblem werden das Passwort des Benutzers herauszufinden.
Ich glaube wir reden hier an einander vorbei, oder meinst du hier nicht das Windows-Passwort? Ich möchte nämlich nicht die Passwörter auslesen! In dem Datenbankfeld "pw" stehen eigene völlig unabhängig vom OS vergebene Passwörter, diese müssen auch nicht mit den vom OS synchronisiert werden. Diese sind nur für den Fall da, dass Anwender bzw. dessen Administrator einstellen, dass die Anwendungseigene Benutzer-Identifikation benutzt werden soll.

Zitat von
Steiner_B
Aber mal ein ganz anderer Gedankengang: Wenn dein Programm gestartet wird reicht es doch eigentlich wenn du feststellst ob der gerade aktive User ein User der Domaine ist. Denn wenn der Benutzer Domainmitglied ist und auf dem Rechner eingeloggt ist kann man ja davon ausgehen das er das Passwort dort schon richtig eingegeben hat.
Das stimmt, d. h. das würde ja in etwa meine oben genannte Idee entsprechen, das SSO über den Benutzer- und Domännamen zu implementieren.

Zitat von
Steiner_B
Soweit ich mich erinnern kann muss man für eine Abfrage nach Benutzername oder Benutzergruppen nicht speziell authentifiziert sein, was bedeutet das dein Programm das Passwort nicht kennen muss. Und wie man den Benutzernamen bekommt haben wir ja eh weiter oben schon mal gehabt.
Ok vielen Dank 
Gruß
RudolfG
Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL

Zitat von
Steiner_B
Hi
Was ich meinte war: Wenn du überprüfen willst ob ein angemeldeter Benutzer wirklich ein gültiger Domänenbenutzer ist müsstest du eine Anfrage mit Benutzernamen und Windowspasswort an das LDAP-Service stellen. Hierzu fehlt dir aber das Passwort.
Ok, kann man als normaler Windows-Benutzer eine LDAP-Abfrage über das Passwort und den Benutzernamen ausführen? Oder benötigt man dafür spezielle Berechtigungen? Wie habt ihr das den in eurer Anwendung (für deine Dipl-Arbeit) gemacht bzw. wie seit ihr an das aktuelle Windows-Passwort gekommen?

Zitat von
Steiner_B
Es gibt eine sog. SSID die genau diese Daten und eine eindeutige Identifizierung zu einem Master-Domänenkontroller beinhaltet. Über diese SSID kannst du dir später mal auch die Gruppen und sonstige Information aus dem Active Directory laden.
Ok und an diese SSID komme ich über eine LDAP-Abfrage in dem AD nur mit dem aktuellen Windows-Benutzernamen?

Zitat von
Steiner_B
...jedoch sind unter Windows Server die Kombination aus Benutzernamen und Domäne keine eindeutige Identifizierung....
.
Diese Aussage verwirt mich gerade, wie erkennt den Windows als welcher der beiden Benutzer "rudolf" ich aus ein und der selben Domäne mich anmelden möchte

Zitat von
Steiner_B
Soweit so gut. Ich hab jetzt schon leicht den Überblick verloren. Sind jetzt noch konkrete Fragen von dir offen?
Außer, die in diesem Beitrag gestellten hat sich das soweit erledigt
Danke 
Gruß
RudolfG
Geändert von RudolfG (10.07.10 um 00:27 Uhr)
Technologien
(Gute) Grundkenntnisse: HTML, CSS
Fortgeschrittene-Kenntnisse: C++/Qt, C# (WinForms, Webservice), SQL