Erweiterung der Service-Stack-Authentifizierung - Füllen der Benutzersitzung mit benutzerdefinierten Benutzer-Authentifizierungsmetadaten

8

Ich versuche, die Authentifizierungs- und Registrierungsfunktionen von Service Stack zu erweitern. Ich habe die Authentifizierung und Registrierung funktioniert gut, aber ich muss einige benutzerdefinierte Daten für jeden Benutzer hinzufügen. Aus der Service Stack-Dokumentation und verschiedenen anderen Posts, die ich gefunden habe, können Sie Ihre eigenen Daten hinzufügen, indem Sie die MetaData-Spalte verwenden, die in der UserAuth-Tabelle enthalten ist.

Ich habe ein CustomAuthRepository erstellt, damit ich die Metadaten-Eigenschaft von UserAuth festlegen kann, hier ist mein benutzerdefiniertes Repo:

%Vor%

Das funktioniert hervorragend, um die Metadaten zu setzen. Ich habe am Ende eine serialisierte Version des LoginInfo-Objekts in der Metadatenspalte der UserAuth-Tabelle.

Nun, was ich versuche zu tun ist, wenn ein Benutzer authentifiziert Ich muss die AuthResponse basierend auf einigen dieser Metadaten ändern. Zum Beispiel, wenn ein Benutzer noch nicht aktiviert ist, möchte ich eine AuthResponse mit einer Eigenschaft IsActive = get value from custom meta data

zurückgeben

Ich könnte das machen, wenn ich meine benutzerdefinierten Metadaten in die AuthSession bekommen könnte. Auf diese Weise konnte ich das Antwortobjekt in meinem benutzerdefinierten Authentifizierungsanbieter ändern, basierend auf den Angaben in der AuthSession:

%Vor%

Tue ich das richtig oder gibt es eine bessere Möglichkeit, benutzerdefinierte Metadaten zu speichern und abzurufen?

Wie kann ich die AuthResponse basierend auf den benutzerdefinierten Metadaten eines Benutzers ändern?

Wie kann ich meine benutzerdefinierten Metadaten in die AuthSession bekommen?

Bearbeiten Ich komme näher an das, was ich zu tun versuche. In meiner CustomAuthSession OnAuthenticated () -Methode:

%Vor%

Ich werfe den UserAuth zurück und befülle die Sitzung mit den Daten, die ich brauche. Basierend auf dem Service-Stack Dokumentation für eine benutzerdefinierte Benutzersitzung, Sie müssen die Sitzung speichern, nachdem Sie sie mit einigen benutzerdefinierten Daten gefüllt haben. Ich mache das, aber es scheint nicht zu sparen. In meiner CustomCredentialsAuthProvider-Methode Authenticate werden die benutzerdefinierten Daten, die ich der Sitzung hinzugefügt habe, nicht angezeigt.

Bearbeiten Das Problem mit meiner ersten Bearbeitung oben ist, dass der Benutzer authentifiziert wird, dann kommen wir zum CustomAuthSession-Code, wo ich überprüfen kann, ob sie aktiv sind oder nicht. Wenn sie nicht aktiv sind, müsste ich sie abmelden, nicht ideal.

Ich habe stattdessen gefunden, dass ich das alles in der Authenticate-Methode meines benutzerdefinierten CredentialsAuthProvider machen kann.

%Vor%

Wenn die Anfrage eingeht, kann ich den Benutzernamen in der Anfrage verwenden, um den UserAuth abzurufen und zu überprüfen, ob der Benutzer IsActive ist oder nicht. Wenn nicht, kann ich einen Fehler zurückgeben, bevor Service Stack sie authentifiziert.

Ich denke, das funktioniert gut genug für das, was ich versuche zu tun. Ich sollte einen Fehler an den Client zurücksenden können, der sagt, dass der Benutzer nicht aktiv ist.

Wenn jemand einen saubereren Weg hat, dies zu tun, wäre das großartig.

    
officert 24.09.2013, 14:33
quelle

1 Antwort

8

Hier ist meine Antwort soweit. Es funktioniert und ich kann tun, was ich versuche zu tun, aber ich würde gerne von einigen der Service Stacks hören, ob dies der beste Weg ist, dies zu tun.

So speichern Sie benutzerdefinierte Metadaten

Erstellen Sie eine neue Klasse, die die Klasse OrmLiteAuthRepository unterklassifiziert. In meinem Fall möchte ich nur Service Stacks eingebaute Sql-Datenbank-Persistenz verwenden und die erforderlichen Tabellen erstellen lassen.

Reaktivieren Sie die CreateUserAuth-Methode, um benutzerdefinierte Metadaten zu speichern:

%Vor%

Abrufen benutzerdefinierter Metadaten

Erstellen Sie eine neue Klasse, die den CredentialsAuthProvider unterklassifiziert. Überschreiben Sie die Authentifizierungsmethode.

%Vor%

Wenn eine Authentifizierungsanforderung in diese Methode gelangt, holen Sie den UserAuth und die benutzerdefinierten Metadaten. Wenn der Benutzer inaktiv ist oder sein Kennwort zurückgesetzt werden muss, wird eine InvalidOperationException mit einer Fehlermeldung ausgelöst.

Im Anmelde-Controller meiner Client-Anwendung kann ich die vom Dienst zurückkommende Fehlermeldung überprüfen und den Benutzer auf eine Seite umleiten, die besagt, dass das Konto noch nicht aktiv ist oder sein Kennwort zurückgesetzt werden muss, bevor es authentifiziert werden kann / p>     

officert 24.09.2013, 19:41
quelle

Tags und Links