Обрабатывать предыдущий токен jwt, где новый токен jwt также генерируется для тех же учетных данных и безопасности

У меня есть приложение в веб-API dot net core 2.2, есть проверка подлинности jwt, а также дата истечения срока действия.

здесь у меня есть некоторые вопросы об этом токене jwt и безопасности для базы токенов webapi

1: здесь у меня проблема с моим предыдущим токеном jwt с тем же повторным входом в систему (для того же пользователя), здесь токен другой, но предыдущий также действителен до истечения срока его действия, поэтому я хочу знать, как я могу обрабатывать предыдущий токен который все еще действителен, но для того же creandiantial создан новый токен

2: хочу убедиться, что мой токен исходит из надежного источника (здесь я также добавил CROS в свой startup.cs). Таким образом, есть более безопасный способ проверить, что попадания токена исходят из доверенного/изменяющего (токена аутентификации пользователя) места.

3: что я должен сделать, чтобы сделать мой токен безопасным (от пользователя к серверу и от сервера к пользователю), например, используя сертификат https SSL

Мне нужно какое-то предложение, чтобы сделать безопасный веб-сайт DOTNET CORE с лучшей безопасностью

Код для генерации JWT

 string BuildToken(int userId)
    {
        var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_configuration["Jwt:Key"]));
        var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

        var token = new JwtSecurityToken(
            _configuration["Jwt:Issuer"],
          _configuration["Jwt:Issuer"],
          new List<Claim> {
          new Claim(ClaimTypes.NameIdentifier , userId.ToString())
          },
          expires: GetExpireDate(),
          signingCredentials: creds);

        return new JwtSecurityTokenHandler().WriteToken(token);
    }

person Amit Singh Rawat    schedule 26.01.2019    source источник
comment
какой инструмент вы используете для создания токена jwt ??? ты свою программу написал?   -  person cheikh ndiaye    schedule 30.01.2019
comment
используя ядро ​​​​DOTNET, есть встроенная библиотека для генерации токена jwt. Просто передайте какой-нибудь параметр, затем создайте токен jwt и обновите вопрос   -  person Amit Singh Rawat    schedule 31.01.2019


Ответы (1)


После создания JWT считается действительным до тех пор, пока не истечет срок его действия, или пока подпись не станет недействительной. Только так токен может «истечь». Генерация нескольких токенов вполне допустима. Но у них всегда должен быть очень короткий срок жизни (несколько минут), потому что, если они скомпрометированы, ими может воспользоваться кто угодно.

Способ справиться с этим сценарием — использовать токены обновления. Они позволяют вам хранить значение на вашем сервере, которое вы можете использовать для включения/отключения дальнейшей перевыпуска токенов для конкретного пользователя.

Более полное объяснение и пример см. на этой странице: http://jasonwatmore.com/post/2018/08/14/aspnet-core-21-jwt-authentication-tutorial-with-example-api

Пункт 2: Все токены, поступающие через AuthHeader, рассматриваются для проверки. Проверка в NetCore выполняется автоматически на основе конфигурации, которую вы применили при настройке JWT.

Итак, проверка вашего токена настроена так:

public void ConfigureServices(IServiceCollection services)
{
     // configure jwt authentication
     var appSettings = appSettingsSection.Get<AppSettings>();
     var key = Encoding.ASCII.GetBytes(appSettings.Secret);
     services.AddAuthentication(x =>
     {
         x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
         x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
     })
     .AddJwtBearer(x =>
     {
         x.RequireHttpsMetadata = false;
         x.SaveToken = true;
         x.TokenValidationParameters = new TokenValidationParameters
         {
             ValidateIssuerSigningKey = true,
             IssuerSigningKey = new SymmetricSecurityKey(key),
             ValidateIssuer = false,
             ValidateAudience = false
         };
     });
}

И в вашем запуске приложения:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseCors(x => x
       .AllowAnyOrigin()
       .AllowAnyMethod()
       .AllowAnyHeader());

    **app.UseAuthentication();**
    app.UseMvc();
}

Наконец, вам нужно применить атрибут [Authorize] к вашим контроллерам следующим образом:

**[Authorize]**
[ApiController]
[Route("[controller]")]
public class UsersController : ControllerBase
{
}

Основная идея заключается в том, что вы «создаете» токен в своем методе «Вход» и возвращаете его вызывающей стороне, а затем передаете этот же токен обратно в свою службу от клиента. При условии, что токен создан с теми же настройками, которые вы использовали для настройки метода ConfigureServices, он будет прочитан промежуточным программным обеспечением и применен к свойству User в HttpContext следующим образом:

public Controller(IHttpContextAccessor httpContextAccessor)
{
    var userId = HttpContextAccessor.HttpContext.User;
}

Если токен отклонен, код HttpStatus 401 будет автоматически отправлен вызывающему абоненту с сообщением «Не авторизован».

Пункт 3: Да, лучший и, вероятно, единственный способ правильно защитить токен JWT — это действительно использовать HTTPS. Компонент «Подпись» токена не защищает его и не предотвращает мошенническое использование; он просто обеспечивает средство для обеспечения того, чтобы он не был подделан

person Robert Perry    schedule 29.01.2019