有没有推荐的方法可以在Identity Server 4中撤销其他用户的访问权限?我关注的用例是管理员撤销当前登录用户的系统访问权限。
我已经阅读了Revocation Endpoint的文档,并且可以看出用户如何通过此方式撤销自己的访问权限。但是当管理员不知道特定用户的访问令牌时,该怎么办?
同样适用于End Session Endpoint,管理员如何知道他们的ID令牌?
到目前为止,我尝试实现了一个
或者将用户令牌持久化到数据库中是否可行? 更新
使用持久化授权无法给我原始访问令牌,但它确实允许我撤销访问令牌,因为
更新2 - Identity Server一直在创建令牌
我创建了一个隐式的mvc客户端,在成功登录后,我将声明转储到屏幕上。我从持久授权数据库中删除访问令牌,然后使用Postman在End Session Endpoint中结束会话(使用声明中的id令牌)。当我刷新浏览器时,我期望用户被重定向到登录界面,但是他们得到了一个新的访问令牌和一个新的id令牌。
你有什么想法吗?
我已经阅读了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秒。你有什么想法吗?