Срок действия JWT истекает слишком быстро в NET Core Web API - PullRequest
0 голосов
/ 09 июля 2020

Я столкнулся с проблемой, когда срок действия моего JWT истекает через несколько минут после простоя, даже после того, как я установил ExpireTimeSpan на 60 минут (или дольше; даже пробовал 1 год).

В настоящее время способ Я удерживаю токен от истечения срока действия, чтобы отправлять фиктивные запросы на мой сервер с интервалом в несколько минут, что на самом деле запускает часть SlidingExpiration.

В идеале я хотел бы сохранить токен в живых даже после того, как пользователь закрывает мою веб-страницу. Я не уверен, что я пропустил в своем коде запуска, какие-либо указатели?

services.AddAuthentication(a =>
{
    a.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    a.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(x =>
{
    string secretKeyStr = Configuration.GetValue<string>("SecretKey");
    byte[] secretKey = null;

    if (secretKeyStr != null)
        secretKey = Encoding.ASCII.GetBytes(secretKeyStr);

    x.RequireHttpsMetadata = false;
    x.SaveToken = true;
    x.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = new SymmetricSecurityKey(secretKey),
        ValidateIssuer = false,// validate the server that generates the token
        ValidateAudience = false,//validate the user who generates token is authorized
        RequireExpirationTime = true,
        ValidateLifetime = true,
        ClockSkew = TimeSpan.FromDays(1),
    };
}).AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => { options.ExpireTimeSpan = TimeSpan.FromMinutes(60); });

services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => false;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});

services.AddDistributedMemoryCache();

services.AddSession(options =>
{
    options.Cookie.SameSite = SameSiteMode.None;
    options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
    options.Cookie.IsEssential = true;
    options.IdleTimeout = TimeSpan.FromMinutes(60);
    options.Cookie.HttpOnly = true;
});

services.ConfigureApplicationCookie(options =>
{
    options.SlidingExpiration = true;
    options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
});

Изменить: вот как я генерирую свой токен.

var JWToken = new JwtSecurityToken(
                issuer: Configuration.GetValue<string>("my_issuer"),
                audience: Configuration.GetValue<string>("my_audience"),
                claims: GetUserClaims(user),
                notBefore: new DateTimeOffset(DateTime.Now).DateTime,
                expires: DateTime.UtcNow.AddYears(1),
                //Using HS256 Algorithm to encrypt Token
                signingCredentials: new SigningCredentials(new SymmetricSecurityKey(secretKey),
                                    SecurityAlgorithms.HmacSha256Signature)
            );
            var token = new JwtSecurityTokenHandler().WriteToken(JWToken);

1 Ответ

0 голосов
/ 09 июля 2020

Можете ли вы попробовать создать такой токен

        var tokenHandler = new JwtSecurityTokenHandler();
        var tokenDescriptor = new SecurityTokenDescriptor
        {
          
            Subject = new ClaimsIdentity(GetUserClaims(user)),
            Expires = DateTime.UtcNow.AddYears(1),
            Issuer = Configuration.GetValue<string>("my_issuer"),
            Audience =Configuration.GetValue<string>("my_audience"),
            SigningCredentials = new SigningCredentials(mySecurityKey, SecurityAlgorithms.HmacSha256Signature),
            NotBefore=new DateTimeOffset(DateTime.Now).DateTime
        };

        var tkn = tokenHandler.CreateToken(tokenDescriptor);
        var token= tokenHandler.WriteToken(tkn);
...