2015-05-11 4 views
5

У меня есть приложение для явного приложения службы, в котором я использую Facebook-клятву и Redis - Facebook и redis стороны вещей, похоже, работают, т.е. когда я нахожусьAuthUserSession имеет значение null внутри службы ServiceStack после успешного auth

abc.com/auth/facebook 

Пользовательский сеанс пользователя заносится в метод OnAuthenticated. Кэш Redis имеет правильные данные. Так хорошо

Проблема Im имеет понимание того, как получить этот CustomUserSession в последующем запросе. Для начала страницы переадресации OAuth «/ О нас», где я хочу, чтобы получить значение сеанса, однако это всегда нуль

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

Как зарегистрировать сеанс кэш & т.д.

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

содержание ConfigureAuth()

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

     Plugins.Add(authFeature); 

Я чувствую, что я что-то очевидное здесь отсутствует .... заранее спасибо

ответ

0

Для регистрации использовать CustomUserSession для ваших типизированных сессий, он должен быть указан при регистрации AuthFeature, например:

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

@MikeW Является ли это просто 'CustomId' это нуль? Если да, то где вы его заполняете, а сеанс сохраняется после? – mythz

+0

объект session является новым(), все значения для сеанса есть, когда OnAuthenticate вызывается как CustomId и Facebook Email и т. Д. В Redis Monitor я могу видеть, что данные сеанса являются SET с ключом. Затем перенаправление на страницу бритвы, где я пытаюсь получить значения - я могу связать вам код проекта, если он помогает – MikeW

+0

@MikeW использует ли 'SET' в Redis Monitor' CustomId'? Вы также можете увидеть запрос «GET» redis для доступа к пользовательскому сеансу, использует ли он тот же ключ сеанса? – mythz

Смежные вопросы