2016-06-06 6 views
4

Hat jemand ein Beispiel für die Verwendung von int RefId, wie in dieser question vorgeschlagen?ServiceStack Benutzerdefinierte Benutzerauthentifizierung

Ich versuche, Authentifizierung zu gehen, aber ich muss die userAuth Daten mit meiner eigenen Benutzertabelle verheiraten. Das Problem ist, ich habe keine Ahnung, wie man einen zusätzlichen Parameter an die "/ register" -Methode übergibt. Ich denke, ich bin auf der Suche nach einem Event wie "OnAddUser", mit dem ich einige zusätzliche Parameter in den Mix einbringen kann.

Ich schaffte es, die Benutzerregistrierung ziemlich schnell arbeiten zu lassen, es war super einfach. Vielleicht ist das Problem, dass es zu einfach war? Ich kann sehen, dass es funktioniert, aber ich kann nicht herausfinden, wie man zwischen ihm und der Datenbank kommt.

Entweder der Wörterbuch-Ansatz oder der RefId-Ansatz wird wahrscheinlich für mich arbeiten, es ist einfach nicht offensichtlich für mich, wie es funktioniert.

Kann der Erstellungsbenutzer insgesamt überschrieben werden? Ich fand diesen Code:

MyServices.cs

, die sieht aus wie es das schaffen Benutzer anstelle von doing „/ Register“ aber es gibt einige andere Artikel, die vorschlagen, dass Sie nicht die ServiceStack DTOs außer Kraft setzen können, Sie muss die Standardtabellen verwenden.

Antwort

2

Sie könnten Ihren eigenen Registrierungsdienst unter Verwendung einer Kopie des RegisterService Quellcodes hinzufügen und ihn an Ihre Bedürfnisse anpassen, z. Verwenden Sie eine benutzerdefinierte Register DTO mit den zusätzlichen Eigenschaften, die Sie möchten.

Aber Sie können leicht zusätzlichen params passieren, ohne den vorhandenen Register DTO zu ändern, indem sie auf die ?querystring Zugabe, die Sie in Ihrem Dienst mit Zugriff auf:

var myParam = base.Request.QueryString["myParam"]; 

sonst die Möglichkeit, Ihre kundenspezifische Logik bei der Registrierung hinzugefügt werden soll oder Die Authentifizierung erfolgt über den vorhandenen Session or Auth Events.

TechStacks hat ein Beispiel dafür in seinem CustomAuthUserSession:

public class CustomUserSession : AuthUserSession 
{ 
    public string DefaultProfileUrl { get; set; } 

    public string GithubProfileUrl { get; set; } 
    public string TwitterProfileUrl { get; set; } 

    public override void OnAuthenticated(IServiceBase authService, 
     IAuthSession session, 
     IAuthTokens tokens, 
     Dictionary<string, string> authInfo) 
    { 
     base.OnAuthenticated(authService, session, tokens, authInfo); 
     var appSettings = authService.TryResolve<IAppSettings>(); 
     var userAuthRepo = authService.TryResolve<IAuthRepository>(); 
     var userAuth = userAuthRepo.GetUserAuth(session, tokens); 
     var dbConnectionFactory = authService.TryResolve<IDbConnectionFactory>(); 
     foreach (var authTokens in session.ProviderOAuthAccess) 
     { 
      if (authTokens.Provider.ToLower() == "github") 
      { 
       GithubProfileUrl = session.GetProfileUrl(); 
      } 
      if (authTokens.Provider.ToLower() == "twitter") 
      { 
       TwitterProfileUrl = session.GetProfileUrl(); 
       if (appSettings.GetList("TwitterAdmins").Contains(session.UserName) 
        && !session.HasRole(RoleNames.Admin)) 
       { 
        userAuthRepo.AssignRoles(userAuth, roles:new[]{RoleNames.Admin}); 
       } 
      } 

      DefaultProfileUrl = GithubProfileUrl ?? TwitterProfileUrl; 
      using (var db = dbConnectionFactory.OpenDbConnection()) 
      { 
       var userAuthInstance = db.Single<CustomUserAuth>(x => 
        x.Id == this.UserAuthId.ToInt()); 
       if (userAuthInstance != null) 
       { 
        userAuthInstance.DefaultProfileUrl = this.DefaultProfileUrl; 
        db.Save(userAuthInstance); 
       } 
      } 
     } 
    } 
} 

, die das Profil Url des Benutzers abruft, wenn sie über GitHub oder Twitter anmelden. Weist die Admin Rolle den Benutzern in der TwitterAdminsAppSetting zu, die eine Möglichkeit ist, bekannten Twitter-Benutzern Administratorrechte zuzuweisen. Abschließend wird die abgerufene Profil-URL der POCO-Tabelle CustomUserAuth hinzugefügt und gespeichert.

TechStacks sagt ServiceStack seine eigene CustomUserAuth Tabelle von registering a generic OrmLiteAuthRepository stattdessen zu verwenden:

var authRepo = new OrmLiteAuthRepository<CustomUserAuth, UserAuthDetails>(dbFactory); 
container.Register<IUserAuthRepository>(authRepo); 
authRepo.InitSchema(); 

Wo es jetzt Benutzer-Informationen in den CustomUserAuth anstelle der Standard-UserAuth Tabelle speichern wird.

+1

Obwohl ich zuvor ähnlichen Code gesehen habe, ergab es für mich keinen Sinn, bis ich sah, wie du es hier präsentiert hast. Danke für Ihre Hilfe. ServiceStack ist genial btw ... – user2033791

+1

Ein kleines Update ... Ich habe nur Datenbank-Trigger verwendet, um die RefId zu aktualisieren. Das scheint gut zu funktionieren und ich benutze die bereits sehr einfachen Servicestack Auth Routinen. – user2033791