Windows SSO mit Laravel 11 und LdapRecord

In vielen Unternehmen läuft die interne Benutzerverwaltung über Active Directory (AD). Wenn eine neue Laravel-Anwendung eingeführt wird, soll sich niemand ein weiteres Passwort merken müssen – die Mitarbeiter sollen sich mit ihrem Windows-Konto automatisch anmelden können. Genau das ist Windows Single Sign-On (SSO). In diesem Artikel zeige ich, wie man das mit Laravel 11 und dem Paket LdapRecord (genauer: LdapRecord-Laravel) umsetzt.

Was ist Windows SSO überhaupt?

Windows SSO bedeutet, dass ein Nutzer, der bereits an einer Windows-Domäne angemeldet ist, sich bei einer Webanwendung nicht erneut mit Benutzername und Passwort anmelden muss. Der Browser übergibt im Hintergrund ein Kerberos-Ticket (oder NTLM als Fallback) an den Server, der Server prüft dieses Ticket gegen den Domain Controller – und der Nutzer ist eingeloggt, ohne ein Formular auszufüllen.

Warum LdapRecord?

LdapRecord ist die aktuell gepflegteste und flexibelste LDAP-Bibliothek für PHP und bringt mit LdapRecord-Laravel eine fertige Integration mit, die sich nahtlos in Laravels Auth-System einklinkt. Im Gegensatz zu älteren Lösungen unterstützt es:

  • Laravel 10 und 11 nativ
  • Mehrere LDAP-Verbindungen gleichzeitig (z. B. mehrere Standorte/Domänen)
  • Synchronisation von AD-Attributen in die lokale users-Tabelle
  • Fallback-Authentifizierung, falls kein SSO-Ticket vorhanden ist

Schritt 1: Installation

composer require directorytree/ldaprecord-laravel
php artisan vendor:publish --tag=ldap-config
php artisan vendor:publish --tag=ldap-auth-config
php artisan vendor:publish --tag=ldap-auth-migrations
php artisan migrate

Schritt 2: LDAP-Verbindung konfigurieren

In config/ldap.php wird die Verbindung zum Domain Controller hinterlegt:

'connections' => [
    'default' => [
        'hosts' => ['dc01.firma.local'],
        'base_dn' => 'dc=firma,dc=local',
        'username' => 'cn=service-account,ou=service,dc=firma,dc=local',
        'password' => env('LDAP_PASSWORD'),
        'port' => 389,
        'use_ssl' => false,
        'use_tls' => true,
    ],
],

Der Service-Account benötigt nur Leserechte auf das Verzeichnis – keine administrativen Rechte.

Schritt 3: Authentifizierungs-Guard einrichten

In config/auth.php wird ein LDAP-Provider ergänzt, der bestehende Laravel-Nutzer mit AD-Konten verknüpft:

'providers' => [
    'users' => [
        'driver' => 'ldap',
        'model' => LdapRecord\Models\ActiveDirectory\User::class,
        'database' => [
            'model' => App\Models\User::class,
            'sync_passwords' => false,
            'sync_attributes' => [
                'name' => 'cn',
                'email' => 'mail',
            ],
        ],
    ],
],

Damit meldet sich ein Benutzer weiterhin klassisch per Formular an – LdapRecord übernimmt im Hintergrund den Abgleich mit AD und legt bei Bedarf automatisch einen lokalen Datensatz an.

Schritt 4: Vom klassischen Login zu echtem SSO

Der Formular-Login allein ist noch kein SSO – dafür fehlt die automatische Erkennung des bereits angemeldeten Windows-Nutzers. Zwei gängige Wege:

Kerberos über den Webserver (empfohlen für IIS/Apache mit mod_auth_kerb)
Der Webserver übernimmt die Kerberos-Verhandlung und liefert den authentifizierten Benutzernamen im Header REMOTE_USER an PHP. In Laravel liest man diesen Header dann in einer eigenen Middleware aus und meldet den Nutzer über LdapRecord an – ganz ohne Login-Formular.

class WindowsSsoMiddleware
{
    public function handle($request, Closure $next)
    {
        $remoteUser = $request->server('REMOTE_USER');

        if ($remoteUser && !Auth::check()) {
            $username = Str::after($remoteUser, '\\'); // DOMAIN\user -> user
            $user = LdapRecord\Models\ActiveDirectory\User::findBy('samaccountname', $username);

            if ($user) {
                Auth::login(
                    App\Models\User::firstOrCreate(['email' => $user->mail[0]])
                );
            }
        }

        return $next($request);
    }
}

NTLM als Fallback
Wenn Kerberos nicht möglich ist (z. B. bei reinem HTTP ohne Domain-Trust zwischen Client und Server), kann NTLM als Übergangslösung dienen. Das ist weniger sicher als Kerberos und sollte nur temporär eingesetzt werden.

Häufige Stolperfallen

  • Service-Account-Rechte: Der LDAP-Bind-Account braucht wirklich nur Leserechte – nichts weiter.
  • TLS statt Klartext: use_tls sollte in Produktivumgebungen immer aktiv sein, damit Zugangsdaten nicht im Klartext über das Netzwerk gehen.
  • Zeit-Synchronisation: Kerberos reagiert empfindlich auf Zeitunterschiede zwischen Server und Domain Controller (mehr als 5 Minuten Abweichung führen zu Fehlern).
  • REMOTE_USER-Header: Dieser wird nur korrekt gesetzt, wenn der Webserver selbst die Kerberos-Verhandlung übernimmt – ein reiner PHP-Prozess kann das nicht allein.

Fazit

Mit LdapRecord-Laravel lässt sich Windows SSO in Laravel 11 sauber und wartbar umsetzen, ohne auf Altlasten oder unsauber gepflegte LDAP-Pakete zurückgreifen zu müssen. Der Aufwand liegt weniger im PHP-Code als in der korrekten Konfiguration von Webserver, Kerberos und Active Directory – hier lohnt sich ein enger Austausch mit der IT-Abteilung des Kunden.

Benötigen Sie Unterstützung bei der Einrichtung von Windows SSO oder anderen LDAP-Integrationen in Ihrer Laravel- oder WordPress-Anwendung? Kontaktieren Sie mich.

Lass uns
reden.

Erzähl mir von deinem Projekt – unverbindlich, auf einen Kaffee (virtuell oder echt).

Termin vereinbarenÜber Whatsapp kotaktieren
Das könnte Sie auch interessieren: