2015-05-11 34 views
5

Ich habe eine selbst gehostete Service-Stack-App, in der ich Facebook Eide und Redis verwende - die Facebook- und Rediseite der Dinge scheinen zu arbeiten, dh. Wenn ich besucheAuthUserSession ist null im ServiceStack-Service nach erfolgreicher Authentifizierung

abc.com/auth/facebook 

Die benutzerdefinierte Benutzersitzung wird in OnAuthenticated-Methode aufgefüllt. Der Redis-Cache hat die Daten korrekt persistiert..so weit so gut

Das Problem Im Haben ist zu verstehen, wie diese CustomUserSession in einer nachfolgenden Anfrage abrufen. Zunächst einmal der oauth umadressierenseite „/ Über-Us“ ist, wo ich den Sitzungswert abrufen möchten aber es ist immer null

[DataContract] 
public class CustomUserSession : AuthUserSession 
{  
    [DataMember] 
    public string CustomId { get; set; } 

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IAuthTokens tokens, Dictionary<string, string> authInfo) 
    { 
     // receiving session id here and can retrieve from redis cache 
    } 
    public override bool IsAuthorized(string provider) 
    { 
     // when using the [Authenticate] attribute - this Id is always 
     // a fresh value and so doesn't exist in cache and cannot be auth'd 
     string sessionKey = SessionFeature.GetSessionKey(this.Id); 

     cacheClient = ServiceStackHost.Instance.TryResolve<ICacheClient>(); 
     CustomUserSession session = cacheClient.Get<CustomUserSession>(sessionKey); 

     if (session == null) 
     { 
      return false; 
     } 
     return session.IsAuthenticated; 
    } 
} 


[DefaultView("AboutUs")] 
public class AboutUsService : AppServiceBase 
{ 
    public object Get(AboutUsRequest request) 
    { 
     var sess = base.UserSession; 
     return new AboutUsResponse 
     { 
      //custom Id is always null?? 
      Name = sess.CustomId 
     }; 
    } 
} 
public abstract class AppServiceBase : Service 
{ 
    protected CustomUserSession UserSession 
    { 
     get 
     { 
      return base.SessionAs<CustomUserSession>(); 
     } 
    } 
} 

Wie ich den Cache & Sitzung usw. registrieren

 AppConfig = new AppConfig(appSettings); 
     container.Register(AppConfig); 
     container.Register<IRedisClientsManager>(c => new PooledRedisClientManager("10.1.1.10:6379")); 
     container.Register(c => 
       c.Resolve<IRedisClientsManager>().GetCacheClient()); 
     ConfigureAuth(container, appSettings); 

der Inhalt von ConfigureAuth()

 var authFeature = new AuthFeature(
      () => new CustomUserSession(), 
      new IAuthProvider[] 
      { 
       new FacebookAuthProvider(appSettings), // override of BasicAuthProvider 
      } 
      ) {HtmlRedirect = null, IncludeAssignRoleServices = false}; 

     Plugins.Add(authFeature); 

ich fühle ich mich hier etwas offensichtlich .... Vielen dank im Voraus

bin fehlt

Antwort

0

registrieren eine CustomUserSession für Ihre eingegebenen Sessions zu verwenden, muss es angegeben werden, wenn Sie die AuthFeature registrieren, z:

Plugins.Add(new AuthFeature(() => new CustomUserSession(), ...)); 
+0

@MikeW Ist es nur 'CustomId', die null ist? Wenn ja, wo bevölkern Sie es und wird die Sitzung danach gespeichert? – mythz

+0

Das Sitzungsobjekt ist neu(), alle Werte für die Sitzung sind vorhanden, wenn OnAuthenticate wie CustomId und Facebook Email usw. aufgerufen wird. In Redis Monitor kann ich sehen, dass die Sitzungsdaten mit dem Schlüssel SET sind. Dann die Umleitung auf die Rasierklingenseite, wo ich versuche und die Werte abzurufen - ich kann Ihnen den Projektcode verlinken, wenn es hilft – MikeW

+0

@MikeW enthält das 'SET' in Redis Monitor die' CustomId'? Können Sie auch die 'GET'-Redis-Anfrage sehen, um auf die benutzerdefinierte Sitzung zuzugreifen, wenn sie den gleichen Sitzungsschlüssel verwendet? – mythz

Verwandte Themen