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

Gav*_*and 5 access-token openid-connect identityserver4

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

我已经阅读了Revocation Endpoint的文档,可以看到用户如何使用它来撤销自己的访问权限.但是,如果管理员不知道特定用户的访问令牌是什么,怎么办?

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

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

或者是将用户令牌持久化到数据库中的选项?

更新

基于从@Mashton回答下面我发现如何在Identity Server文档实现持久性的例子在这里.

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

    const string KeySeparator = ":";
    protected string GetHashedKey(string value)
    {
        return (value + KeySeparator + _grantType).Sha256();
    }
Run Code Online (Sandbox Code Playgroud)

... 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";
    }
Run Code Online (Sandbox Code Playgroud)

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

更新2 - Identity Server不断创建令牌

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

我在这里缺少什么想法?

Mas*_*ton 7

您只能撤销Reference tokensJWTs和是那些需要存储在数据库中.看看IPersistedGrantStore(我的头顶,所以可能有错误的名字),你会看到结构非常简单.

一旦你将它们存储起来,你显然可以做任何你喜欢管理的事情,比如改变过期或者直接删除它们.

  • 那里听起来不太合适.我们使用`ResourceOwnerPassword`授权,来自IdSvr的访问令牌请求导致在db中存储授权,并且将`reference token`返回给客户端.现在,每当客户端尝试访问受保护资源时,使用该引用令牌,受保护资源将调用IdSvr来验证引用是否存在已存在,未过期,具有适当授权等的令牌.如果我从中删除该授权db然后使用该引用令牌的所有调用将返回401,并且用户将需要请求新令牌. (3认同)
  • 我想我会描述,因为客户端正在重新请求访问令牌,而不是IdSvr自动创建新令牌.除非您的客户端提供凭据,否则IdSvr不会创建令牌.我会研究一下我用来请求令牌的机制,并从那里开始.饼干/会话是否涉及到某个地方? (2认同)