我有一个基于Identity Server 3的身份验证服务。最近,我将其从JWT切换到引用令牌,并在UserService中实现了SignOutAsync以在用户注销时撤消令牌。代码如下:
public override Task SignOutAsync(SignOutContext context)
{
string subjectId = GetSubjectId(context);
_tokenHandleStore.RevokeAsync(subjectId, context.ClientId);
return Task.FromResult(0);
}
该代码似乎起作用。 (在此post中,建议使用ITokenHandleStore接口和RevokeAsync方法。) 如果我复制参考令牌,则可以使用它来访问我的服务,直到用户注销为止。然后,参考令牌将不再起作用。正如我所期望的。
然后,我使用Identity Server的内置Entity Framework实现(用于操作数据)介绍了参考令牌的持久存储。如我所料,令牌已写入数据存储或从数据存储中清除,但是当用户注销时,令牌似乎不再被吊销。即使用户已注销,我也可以复制参考令牌并使用它来访问服务。
我已经遍历了代码,所以我知道我的SignOutAsync方法正在被调用,并且_tokenHandleStore.RevokeAsync正在被调用。
ITokenHandleStore.RevokeAsync是否是正确的调用方法?撤销令牌后,我应该在数据库令牌表中看到什么?是否将其删除或修改?我发现数据存储中的令牌数据没有变化。持久性存储和吊销都是Identity Server的内置功能,但是它们彼此了解吗? ITokenHandleStore的内置实现是否检测到持久存储的使用并吊销这些令牌?还是我需要以某种方式扩展该方法或调用自定义方法?