希望快速提问..
我发现在使用jwt身份验证时,ServiceStack的GetSession()
方法在可选参数reload == true
时无法完全刷新会话。
var session = GetSession(reload: true);
会话非常稀疏地填充了一些基本日期和ID。
这是预期的行为吗? 我希望它能够在填充UserAuth的情况下返回一个完整的会话对象吗?
编辑:修正了方法名称中的拼写错误(大写 - 最近一直在使用打字稿)
答案 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调用从后端数据存储中检索用户信息。