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

8
有没有推荐的方法可以在Identity Server 4中撤销其他用户的访问权限?我关注的用例是管理员撤销当前登录用户的系统访问权限。
我已经阅读了Revocation Endpoint的文档,并且可以看出用户如何通过此方式撤销自己的访问权限。但是当管理员不知道特定用户的访问令牌时,该怎么办?
同样适用于End Session Endpoint,管理员如何知道他们的ID令牌?
到目前为止,我尝试实现了一个IProfileService,并在IsActiveAsync方法中检查用户帐户是否有效。在我们的客户数据库中,我可以停用他们的帐户,这会将其重定向到登录页面。但令牌和会话仍然“存活”。这是否是结束会话和撤销访问令牌的好地方?
或者将用户令牌持久化到数据库中是否可行? 更新

根据下面@Mashton的回答,我在这里找到了一个实现持久化的例子here

按照描述创建数据迁移将令令牌存储到[dbo].[PersistedGrants]中的Key列。一开始我很困惑,因为它们看起来与我的参考访问令牌完全不同,但经过一番搜索,我发现它们被存储为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]表有SubjectId
更新2 - Identity Server一直在创建令牌
我创建了一个隐式的mvc客户端,在成功登录后,我将声明转储到屏幕上。我从持久授权数据库中删除访问令牌,然后使用Postman在End Session Endpoint中结束会话(使用声明中的id令牌)。当我刷新浏览器时,我期望用户被重定向到登录界面,但是他们得到了一个新的访问令牌和一个新的id令牌。 Client.IdentityTokenLifetime只有30秒。
你有什么想法吗?
1个回答

8

您只能撤销引用令牌而非JWTs,是的,这些需要存储在数据库中。请查看IPersistedGrantStore(我脑海中记得,可能名称不正确),您将看到结构非常简单。

一旦您将它们存储,您可以在管理员方面做任何想做的事情,例如更改到期日期或彻底删除它们。


感谢@Mashton。将数据持久化到数据库中解决了一半的问题,即删除访问令牌。但我无法看到身份令牌被持久化在任何地方,因此理论上可以自动创建新的访问令牌。您知道如何删除他们的会话吗? - Gavin Sutherland
@GavinSutherland 我认为引用令牌只是一个唯一标识符,发送到受保护的资源,然后资源将引用令牌发送给 STS(idsrv),在验证引用令牌未被吊销后将其实现为完整令牌。因此,用户看不到实际令牌。虽然我对这些问题不是专家。请参见 https://leastprivilege.com/2015/11/25/reference-tokens-and-introspection/ - Mardoxx
你撤销了引用令牌,用户就不能再做任何事情了,是吗?@GavinSutherland - Mardoxx
3
那里似乎有些不对劲。我们使用“ResourceOwnerPassword”授权,从IdSvr请求访问令牌会导致将授权存储在数据库中,并返回一个“参考令牌”给客户端。现在,每当客户端尝试使用该参考令牌访问受保护的资源时,受保护的资源将调用IdSvr来验证该参考是否为存在、未过期、具有适当授权等方面的令牌。如果我从数据库中删除该授权,则所有使用该参考令牌的调用将返回401,用户将需要请求新的令牌。 - Mashton
2
我认为我会将其描述为客户端正在重新请求访问令牌,而不是IdSvr自动创建新令牌。除非您的客户端提供凭据,否则IdSvr不会创建令牌。我会研究一下我用来请求令牌的机制,并从那里开始。是否涉及到了cookies/session? - Mashton
显示剩余10条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接