2015-05-11 24 views
5

Mam aplikację hostowaną na własny serwer, w której używam serwisów Facebook Oath i Redis - strona Facebook i strona redis wydają się działać. kiedy odwiedzamAuthUserSession ma wartość null w usłudze ServiceStack po pomyślnym uwierzytelnieniu

abc.com/auth/facebook 

Niestandardowa sesja użytkownika zapełniana jest metodą OnAuthenticated. Pamięć podręczna Redis ma dane przechowywane poprawnie ... tak daleko, dobrze

Problem polegający na tym, że mam problem z odzyskaniem tej CustomUserSession w kolejnym żądaniu. Na początek strony przekierowania OAuth „/ O-us” jest tam, gdzie chcę, aby pobrać wartość sesji jednak zawsze jest zerowa

[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>(); 
     } 
    } 
} 

Jak zarejestrować sesję cache & itp

 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); 

zawartość ConfigureAuth()

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

     Plugins.Add(authFeature); 

czuję, że czegoś brakuje tutaj oczywisty .... Dzięki z góry

Odpowiedz

0

się zarejestrować, aby skorzystać z CustomUserSession wpisywanych do swoich sesji, musi zostać określony po zarejestrowaniu AuthFeature, np:

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

@MikeW Czy to tylko 'CustomId' to zerowy? Jeśli tak, gdzie go zapełniasz i czy sesja jest zapisywana później? – mythz

+0

obiekt sesja jest nowy(), wszystkie wartości dla sesji są tam, gdy OnAuthenticate jest wywoływana jak CustomId i Facebook Email itp. W Redis Monitor Widzę dane sesji są ustawione za pomocą klucza. Następnie przekierowanie do strony brzytwy, na której próbuję pobrać wartości - mogę połączyć kod projektu, jeśli pomaga – MikeW

+0

@MikeW Czy 'SET' w Redis Monitor zawiera' CustomId'? Czy widzisz również żądanie "GET" redis, aby uzyskać dostęp do sesji niestandardowej, czy używa tego samego klucza sesji? – mythz