ServiceStack GetSession()重新加载(使用jwt auth)

时间:2018-03-12 14:23:13

标签: c# servicestack

希望快速提问..

我发现在使用jwt身份验证时,ServiceStack的GetSession()方法在可选参数reload == true时无法完全刷新会话。

var session = GetSession(reload: true);

会话非常稀疏地填充了一些基本日期和ID。

这是预期的行为吗? 我希望它能够在填充UserAuth的情况下返回一个完整的会话对象吗?

编辑:修正了方法名称中的拼写错误(大写 - 最近一直在使用打字稿)

1 个答案:

答案 0 :(得分:1)

ServiceStack.dll中没有getSession()函数的camelCase,所以我只是假设您指的是IRequest.GetSession()扩展方法。

关于JWT令牌需要记住的关键是它们是无状态,它们将minimal user info包裹在封装的令牌内,以保持JWT有效载荷很小,因为它是'通常会对每个请求感到不满。您可以使用CreatePayloadFilter更改JWT中嵌入的信息。您还可以识别是否仅从具有session.FromToken=true属性的JWT部分填充了UserSession。

JWT无国籍的另一个后果是服务器上没有任何状态存储,例如:对于典型的Cookie-based Sessions,cookie包含一个sessionId,它引用已注册的ICacheClient中持久存在的UserSession,并且调用req.GetSession(reload:true)将从缓存中获取最新版本的UserSession。由于在使用JWT时通常没有持久的UserSession,因此缓存中不存在可以检索的UserSession,因此ServiceStack返回空UnAuthenticated Session (例如session.IsAuthenticated=false)。

相反,如果您想要有关用户的完整信息,您应该使用session.UserAuthId直接从Auth存储库获取它,例如:

var session = SessionAs<AuthUserSession>();
IUserAuth user = AuthRepository.GetUserAuth(session.UserAuthId);

如果您需要经常这样做以获取默认情况下未封装在JWT令牌中的信息,您可能需要考虑使用CreatePayloadFilter将此信息嵌入JWT令牌中,这样您就可以避免使用/ O调用从后端数据存储中检索用户信息。