检查黑名单中的 JWT 令牌

Posted

技术标签:

【中文标题】检查黑名单中的 JWT 令牌【英文标题】:Check JWT token in blacklist 【发布时间】:2021-04-16 16:17:39 【问题描述】:

我正在使用 web API .net core 3.1,我的情况是,当用户注销时,我会将用户的 JWT 令牌放入存储在数据库中的黑名单中,这样即使 JWT 令牌也无法访问系统虽然还没有过期。

目前,我将'CheckJWTTokenInBlacklist'函数放在每个API函数中,如下所示。

        [Authorize]
        [HttpPost]
        public ActionResult Add(OrderRequest req)
        
            if (ModelState.IsValid)
            
                string token = HttpContext.Response.Headers["Authorization"]; 
                if (_coffeeToken.CheckJWTTokenInBlacklist(token) == false) //Check whether the token is blacklisted.
                
                    //token is not in blacklist
                   
                
                else
                
                   // token is in blacklist
                
            
            return BadRequest(ModelState);
        

我认为这不是最好的方法,因为每个 API 都需要 JWT 令牌,我必须设置上述检查功能。有没有更好的方法? 谢谢!!

【问题讨论】:

***.com/questions/53455939/… 感谢您的回答,我在您的链接中看到 JWT 令牌将在 startup.cs 文件中进行验证,但在我的情况下,我将检查 jwt 令牌是否在存储在数据库中的黑名单中或不?如果我声明一个对象来与数据库通信,那就不好了,因为我正在使用依赖注入。 您可以使用内存缓存并每次都访问它,这不是一个答案,但会发布一个答案,以便我可以共享代码 【参考方案1】:

创建了一个内存缓存,用于保存所有 JWTToken,然后从您想要的任何 Action Controller 访问它们。

public static class JWTTokenCache

    private static Dictionary<Guid, JWTTokenClass>? cache;

    private static object cacheLock = new object();
    public static Dictionary<Guid, JWTTokenClass> AppCache
    
        get
        
            lock (cacheLock)
            
                if (cache == null)
                
                    cache = new Dictionary<Guid, JWTTokenClass>();
                
                return cache;
            
        
    

现在你可以像这样访问这个 JWTtoken

    [Authorize]
    [HttpPost]
    public ActionResult Add(OrderRequest req)
    
       //var token = JWTTokenCache.AppCache[Guid]; --This is your blacklist
       //  if (_coffeeToken.CheckJWTTokenInBlacklist(token) == false) -- Change this if condition accrodingly
        
        if (ModelState.IsValid)
        
            string token = HttpContext.Response.Headers["Authorization"]; 
            if (_coffeeToken.CheckJWTTokenInBlacklist(token) == false) //Check whether the token is blacklisted.
            
                //token is not in blacklist
               
            
            else
            
               // token is in blacklist
            
        
        return BadRequest(ModelState);
    

【讨论】:

谢谢我去试试 @David 当然,如果这对您有用,请告诉我,如果您找到更好、更酷的方法,请不要忘记分享您的解决方案。乐意效劳。干杯:)

以上是关于检查黑名单中的 JWT 令牌的主要内容,如果未能解决你的问题,请参考以下文章

黑名单 JWT 令牌

JWT 有效负载中的令牌

JWT 注销:在微服务架构中的服务之间共享被列入黑名单的无效令牌

flask-jwt-extended 库中的黑名单是不是有宽限期?

使用黑名单缓存使JWT无效是否安全?

如何使用 Simple JWT(django rest)将 JWT 令牌列入黑名单?