如何撤销存储在 Identity Server 数据库中的 asp net core 中的刷新令牌

Posted

技术标签:

【中文标题】如何撤销存储在 Identity Server 数据库中的 asp net core 中的刷新令牌【英文标题】:How to revoke refresh token in aspnet core which is store in Identiy Server Database 【发布时间】:2020-08-28 07:22:02 【问题描述】:

通过从 Aspnet 核心(API 层)调用身份服务器 4 的 RevokeAccessTokenAsync(param: accesstoken) 方法来轻松撤销令牌。 我可以轻松地获取登录用户的访问令牌,因为我可以从 HttpContext.GetTokenAsync("accesstoken") 获取它。但是,此方法不适用于刷新令牌,因此我无法禁用用户再次获取访问令牌。 刷新令牌存储在我不想访问的身份服务器数据库中,因为我想从 API 层调用撤销访问令牌。

这让我获得了访问令牌: 访问令牌 = 等待 HttpContext.GetTokenAsync("access_token");

这将返回一个空字符串: refreshtoken = 等待 HttpContext.GetTokenAsync("refresh_token");

【问题讨论】:

嗨,Ayan,欢迎来到社区!请发布您尝试过的内容以及针对您的场景的更多详细信息。由于编写了这个问题,因此期望得到好的答案仍然有点过于宽泛。请添加您已经尝试过的内容,以及您不能或不想访问身份数据库的原因,这可能是您撤销用户访问权限的最佳选择。 【参考方案1】:

尝试了一些可以解决我的问题的方法。覆盖 RevokeRefreshTokenAsync 并假设传递的令牌是访问令牌,现在使用访问令牌撤消所有刷新令牌。

         public class CustomTokenRevocationResponseGenerator : TokenRevocationResponseGenerator, ITokenRevocationResponseGenerator


    /// <summary>
    /// Revoke refresh token only if it belongs to client doing the request
    /// </summary>
    protected override async Task<bool> RevokeRefreshTokenAsync(TokenRevocationRequestValidationResult validationResult)
    
        Logger.LogInformation("Revoking refresh token");
        //assume the token is access token instead of refresh token
        var token = await ReferenceTokenStore.GetReferenceTokenAsync(validationResult.Token);
        if (token != null)
        
            Logger.LogInformation($"Revoking refresh token for clientId token.ClientId ");
            if (token.ClientId == validationResult.Client.ClientId)
            
                Logger.LogDebug("Refresh token revoked");
                await RefreshTokenStore.RemoveRefreshTokensAsync(token.SubjectId, token.ClientId);
                await ReferenceTokenStore.RemoveReferenceTokensAsync(token.SubjectId, token.ClientId);
            
            else
            
                Logger.LogWarning("Client clientId tried to revoke a refresh token belonging to a different client: clientId", validationResult.Client.ClientId, token.ClientId);
            

            return true;
        

        return false;
    



    public CustomTokenRevocationResponseGenerator(IReferenceTokenStore referenceTokenStore, IRefreshTokenStore refreshTokenStore, ILogger<TokenRevocationResponseGenerator> logger) : base(referenceTokenStore, refreshTokenStore, logger)
    
    

【讨论】:

以上是关于如何撤销存储在 Identity Server 数据库中的 asp net core 中的刷新令牌的主要内容,如果未能解决你的问题,请参考以下文章

Identity server4改用MySQL存储数据

如何在WSO2 Identity Server 5.3.0中从CSV批量导入批量密码过期时间

如何在 Thinktecture Identity Server 中加密 JWT 令牌?

如何从 SQL Server SELECT 语句返回新的 IDENTITY 列值?

如何在 Identity Server 4 中使用主域进行 Openid 身份验证?

如何在 Identity Server 中设置 .well-known/openid-configuration 端点