Ich kämpfe derzeit ein wenig mit meiner benutzerdefinierten CredentialsAuthProvider
Implementierung. Zuerst ist es wichtig zu sagen, dass ich einen WPF-Client als Referenz für meine API schreibe.Servicestack - Authentifizierungsfragen
- Ein Browser speichert Cookies und Sie können konfigurieren, wie Sie mit ihnen umgehen, z. löschen, wenn der Browser geschlossen ist. Auf Windows-Desktop haben Sie Environment.SpecialFolder.Cookies, wo Windows Cookies speichert. Aber von ServiceStack konnte ich nichts finden. Speichern Sie also nichts in einer Windows Desktop App? Ich sah, dass es eine
client.CookieContainer
gibt, wo ich nach dem Login drei Cookies finde. Kann ich irgendwie Eigenschaften zu diesem Cookie während der Authentifizierung hinzufügen? Wenn das so ist, wie? Derzeit verwende ich
AuthenticationResponse.Meta
Wörterbuch zusätzliche Informationen zu übertragen:public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request) { var authResponse = (AuthenticateResponse)base.Authenticate(authService, session, request); authResponse.Meta = new Dictionary<string, string>(); authResponse.Meta.Add("Test", "TestValue"); return authResponse; }
Und schließlich: Ist eine Instanz meiner
CredentialsAuthProvider
Klasse Thread abgeleitet sicher? InTryAuthenticate(...)
Ich mache eine DB-Verbindung und ein Objekt abrufen, die alle Informationen einschließlich Hash-Passwort usw. enthält. Aber ich kann diese Informationen nur für das Sitzungsobjekt inOnAuthenticated(....)
ausfüllen und/oderAuthenticate(...)
übersteuert. Wenn möglich, möchte ich keinen weiteren DB-Aufruf machen, um das gleiche Objekt erneut abzurufen. So ist es sicher ein Mitglieduser
füllen es inTryAuthenticate
und Wiederverwendung in anderen überschrieben Methoden zu erklären, wie so:public class BediCredentialsAuthProvider : CredentialsAuthProvider { private AppUser user = null; public override object Authenticate(IServiceBase authService, IAuthSession session, Authenticate request) { var authResponse = (AuthenticateResponse)base.Authenticate(authService, session, request); authResponse.Meta = new Dictionary<string, string>(); authResponse.Meta.Add("ValueA", user.ValueA); // ... add more properties from user object return authResponse; } public override bool TryAuthenticate(IServiceBase authService, string userName, string password) { AppUser user = null; using (var session = NhSessionFactories.OpenSession(TopinConstants.TopInDbFactory)) { using (var transaction = session.BeginTransaction()) { try { var appUserRepo = new AccountManagementRepository(session); user = appUserRepo.GetAppUser(userName); // get user from database using NHibernate transaction.Commit(); session.Close(); } catch (Exception ex) { Log.Error($"Error retrieving user {user} to authenticate. Error: {ex}"); throw; } } } // do some logic to test passed credentials and return true or false } public override IHttpResult OnAuthenticated(IServiceBase authService, IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo) { session.DisplayName = user.DisplayName; session.FirstName = user.Firstname; session.LastName = user.Lastname; session.Email = user.EmailAddress; // etc..... return base.OnAuthenticated(authService, session, tokens, authInfo); } }