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
@MikeW Ist es nur 'CustomId', die null ist? Wenn ja, wo bevölkern Sie es und wird die Sitzung danach gespeichert? – mythz
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
@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