实施单用户会话 - ServiceStack

时间:2018-06-07 19:36:27

标签: servicestack

在ServiceStack会话cookie中使用ss-pid,我正在尝试为给定唯一用户ID强制执行单个用户会话。

当用户登录时,我能够持久保存ServiceStack会话ID。

当用户Bearer Token过期并使用Refresh Token时,我想检查他们的会话ID是否与我的持久性中的内容相对应,如果用户有新的会话ID则抛出异常,登录不同的设备等。

我的问题是,我没有看到使用ServiceStack框架获取访问令牌请求中包含的当前ss-pid值的方法。我看到来自具有RefreshToken的API的access-token请求在请求中包含ss-pid cookie:

enter image description here

我已实施IUserSessionSource,文档here,以便对BearerToken进行水合,并且该方法仅接收userAuthId

我查看了IAuthProvider中的其他可用方法,但未调用IsAuthorized。我认为Validate中的AuthUserSession可以帮助我缩短授权,但该方法似乎不再是AuthUserSession的一部分,而且documentation中的签名是反正不是虚拟的:

IHttpResult Validate(IServiceBase authService, IAuthSession session, 
    IAuthTokens tokens, Dictionary<string, string> authInfo);

如何从访问令牌请求中获取ss-pid,以便根据自定义逻辑短路请求?

------------------ UPDATE -------------------- < / p>

我找到了这种方法来获取ss-pid

    public IAuthSession GetUserSession(string userAuthId)
    {
        IRequest req = HostContext.TryGetCurrentRequest();
        IAuthSession session = req.GetSession();
    }

我想这是合适的,而不是一个hacky解决方案?

1 个答案:

答案 0 :(得分:0)

AuthUserSession are virtual上的所有方法。

JWT's are stateless,他们的会话封装在JWT BearerToken中。我不会尝试添加您自己的会话cookie,因为它与从JWT BearerToken提取的会话冲突。如果要在身份验证上保存元数据,请使用自己的模型将其保存在缓存或数据库中,而不是在使用无状态Auth Provider(如JWT)时尝试创建自己的UserSession。

相关问题