有没有办法撤销另一个用户的访问令牌并结束他们在 Identity Server 4 中的会话?

Is there a way to revoke another user's access tokens and end their session in Identity Server 4?

是否有推荐的方法来撤销另一个用户在 Identity Server 4 中的访问权限?我正在查看的用例是管理员撤销当前登录用户的系统访问权限。

我已经阅读了 Revocation Endpoint 的文档并且可以了解用户如何使用它来撤销他们自己的访问权限。但是,当管理员不知道特定用户的访问令牌是什么时,如何做到这一点?

我想 End Session Endpoint 也是如此,管理员如何知道他们的 ID 令牌?

到目前为止,我尝试的是实施 IProfileService 并检查用户帐户在 IsActiveAsync 方法中是否有效。在我们的客户数据库中,我可以停用他们的帐户,这具有将他们重定向到登录页面的预期效果。但是令牌和会话仍然是'alive'。这是结束会话和撤销访问令牌的好地方吗?

或者将用户令牌持久保存到数据库是一种选择吗?

更新

根据下面@Mashton 的回答,我在 Identity Server 文档中找到了一个如何实现持久性的示例 here

创建此处描述的数据迁移会将令牌持久保存到 Key 列中的 [dbo].[PersistedGrants]。一开始我很困惑,因为它们看起来一点也不像我的参考访问令牌,但经过一番挖掘后我发现它们存储为 SHA-256 哈希。查看 Identity Server's GitHub 中的 DefaultGrantStore 实现,哈希键计算如下 ...

    const string KeySeparator = ":";
    protected string GetHashedKey(string value)
    {
        return (value + KeySeparator + _grantType).Sha256();
    }

... 其中 value 是令牌,_grantType 是以下之一 ...

    public static class PersistedGrantTypes
    {
        public const string AuthorizationCode = "authorization_code";
        public const string ReferenceToken = "reference_token";
        public const string RefreshToken = "refresh_token";
        public const string UserConsent = "user_consent";
    }

使用持久授权不会给我原始访问令牌,但它确实允许我撤销访问令牌,因为 [dbo].[PersistedGrants] table 具有 SubjectId.

更新 2 - 身份服务器不断创建令牌

我创建了一个隐式 mvc 客户端,成功登录后我将声明转储到屏幕上。我从持久授权数据库中删除访问令牌,然后使用 Postman 在结束会话端点结束会话(使用声明中的 id 令牌)。当我刷新浏览器时,我希望用户被重定向到登录屏幕 但是 他们得到一个新的访问令牌和一个新的 ID 令牌。 Client.IdentityTokenLifetime只有30秒。

关于我在这里遗漏的任何想法?

您只能撤销 Reference tokens 而不能撤销 JWTs,是的,这些需要存储在数据库中。看看 IPersistedGrantStore(在我的头顶,所以可能把名字弄错了),你会发现结构非常简单。

存储它们后,您显然可以在管理方面做任何您喜欢的事情,例如更改到期时间或直接删除它们。