Время истечения срока действия токена JWT при отказе ядра .NET

Я пытаюсь реализовать аутентификацию на основе токенов с помощью токенов обновления и JWT в .NET Core 2.1.

Вот как я реализую токен JWT:

Startup.cs

services.AddAuthentication(option =>
    {
        option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        option.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
    }).AddJwtBearer(options =>
    {
        options.SaveToken = true;
        options.RequireHttpsMetadata = true;
        options.TokenValidationParameters = new TokenValidationParameters()
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidAudience = Configuration["Jwt:Site"],
            ValidIssuer = Configuration["Jwt:Site"],
            IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["Jwt:SigningKey"]))
        };

        options.Events = new JwtBearerEvents
        {
            OnAuthenticationFailed = context =>
            {
                if (context.Exception.GetType() == typeof(SecurityTokenExpiredException))
                {
                    context.Response.Headers.Add("Token-Expired", "true");
                }
                return Task.CompletedTask;
            }
        };
    });

Генерация токенов:

var jwt = new JwtSecurityToken(
                issuer: _configuration["Jwt:Site"],
                audience: _configuration["Jwt:Site"],
                expires: DateTime.UtcNow.AddMinutes(1),
                signingCredentials: new SigningCredentials(signinKey, SecurityAlgorithms.HmacSha256)
                );

        return new TokenReturnViewModel()
        {
            token = new JwtSecurityTokenHandler().WriteToken(jwt),
            expiration = jwt.ValidTo,
            currentTime = DateTime.UtcNow
        };

Я получаю правильные значения в ответе.

введите описание изображения здесь

Но через минуту я установил такой же токен для авторизации в Почтальоне, и он работает. Если срок действия токена истек, этого не должно быть.

Я использую токены на предъявителя в качестве аутентификации.

Что я делаю неправильно? Требуется направление.


person Abhilash Gopalakrishna    schedule 13.03.2019    source источник
comment
Вы проверили значение местной даты и времени, а не значение UTC?   -  person Sonal Borkar    schedule 13.03.2019
comment
У меня местное время дает следующую проблему: - expires принимает время UTC автоматически, независимо от того, что я использую.   -  person Abhilash Gopalakrishna    schedule 13.03.2019
comment
@AbhilashGopalakrishna Всегда использовать время UTC с токеном, а не местное   -  person Divyang Desai    schedule 14.03.2019


Ответы (1)


Есть один параметр проверки токена, называемый ClockSkew, он получает или устанавливает сдвиг часов, применяемый при проверке времени. Значение по умолчанию ClockSkew составляет 5 минут. Это означает, что если вы его не установили, ваш токен будет действителен до 5 минут.

Если вы хотите, чтобы срок действия вашего токена истек в точное время; вам нужно установить ClockSkew в ноль следующим образом:

options.TokenValidationParameters = new TokenValidationParameters()
{
    //other settings
    ClockSkew = TimeSpan.Zero
};

Другой способ - создать пользовательский AuthorizationFilter и проверить его вручную.

var principal = ApiTokenHelper.GetPrincipalFromToken(token);
var expClaim = principal.Claims.First(x => x.Type == "exp").Value;
var tokenExpiryTime = Convert.ToDouble(expClaim).UnixTimeStampToDateTime();
if (tokenExpiryTime < DateTime.UtcNow)
{
  //return token expried
} 

Здесь GetPrincipalFromToken - это настраиваемый метод класса ApiTokenHelper, который вернет значение ClaimsPrincipal, которое вы сохранили при выдаче токена.

person Divyang Desai    schedule 14.03.2019
comment
супер раздражающее нарушение изменения из .net framework :( - person Ewan; 10.09.2019
comment
Есть дополнительная документация по этому поводу? 300 секунд - довольно много. - person Ashwin Kumar; 02.06.2021