Проверьте токен JWT в черном списке

Я использую веб-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, я должен установить вышеуказанную функцию проверки. Есть ли лучшие способы? Спасибо !!


person hiep nguyenduc    schedule 11.01.2021    source источник
comment
stackoverflow.com/questions/53455939/   -  person Newton Sheikh    schedule 11.01.2021
comment
Спасибо, что ответили мне, я вижу в вашей ссылке токен JWT будет проверен в файле startup.cs, но в моем случае я проверю, находится ли токен jwt в черном списке, хранящемся в базе данных, или нет? Было бы нехорошо, если бы я объявил объект для связи с базой данных, потому что я использую внедрение зависимостей.   -  person hiep nguyenduc    schedule 11.01.2021
comment
вы можете использовать кеш в памяти и получать к нему доступ каждый раз, думал, что это не ответ, но опубликует ответ, чтобы я мог поделиться кодом   -  person Newton Sheikh    schedule 11.01.2021


Ответы (1)


Создан кеш в памяти, в котором хранятся все JWTToken, а затем доступ к ним из любого контроллера действий, который вы хотите.

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);
    }
person Newton Sheikh    schedule 11.01.2021
comment
спасибо попробую - person hiep nguyenduc; 11.01.2021
comment
@David, конечно, дайте мне знать, сработает ли это для вас, и если вы найдете еще лучший и более крутой способ, не забудьте поделиться своим решением. Рад помочь. Ваше здоровье :) - person Newton Sheikh; 11.01.2021