有没有办法撤销另一个用户的访问令牌并结束他们在 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
(在我的头顶,所以可能把名字弄错了),你会发现结构非常简单。
存储它们后,您显然可以在管理方面做任何您喜欢的事情,例如更改到期时间或直接删除它们。
是否有推荐的方法来撤销另一个用户在 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
(在我的头顶,所以可能把名字弄错了),你会发现结构非常简单。
存储它们后,您显然可以在管理方面做任何您喜欢的事情,例如更改到期时间或直接删除它们。