Timur2342
@Timur2342

По какой причине jwt токен не валидный?

Настройки аутентификации, если точнее валидации токена:
builder.Services.AddAuthentication(auth =>
{
    auth.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    auth.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer((opts) =>
{
    opts.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = false,
        ValidateAudience = false,

        ValidateIssuerSigningKey = true,
        IssuerSigningKey = jwtOptions.GetSymmetricSecurityKey(),

        ValidateLifetime = true,

        ValidAlgorithms = new List<string> { jwtOptions.Algorithm },
        LifetimeValidator = (notBefore, expires, securityToken, validationParameters) =>
        {
            if (expires != null)
                return expires.Value > DateTime.UtcNow;

            return false;
        }
    };
    opts.Events = new JwtBearerEvents
    {
        OnMessageReceived = async (context) =>
        {
            if (string.IsNullOrEmpty(context.Token) &&
                context.Request.Cookies.TryGetValue(jwtOptions.TokenNameInCookies, out var token))
            {
                context.Token = "Bearer " + token;
            }

            await Task.CompletedTask;
        }
    };
});


Вот метод который отвечает за генерацию токена:
public string Generate(UserEntity user)
 {
     var signingCredentials = new SigningCredentials(
        _options.GetSymmetricSecurityKey(),
          _options.Algorithm);

     var claims = new Claim[]
     {
         new Claim(ClaimTypes.NameIdentifier, user.Id.ToString()),
         new Claim("userName", user.Name),
         new Claim("userEmail", user.Email)
     };

     var token = new JwtSecurityToken(
         //issuer: _options.Issuer,
         //audience: _options.Audience,
         claims: claims,
         notBefore: DateTime.UtcNow,
         expires: DateTime.UtcNow.AddMinutes(_options.AccessTokenExpiresMinutes),
         signingCredentials: signingCredentials);
         
     return new JwtSecurityTokenHandler().WriteToken(token);
 }

Конфигурация appsettings.Development.json(среда у меня именно разработчика):
{
  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "Microsoft.AspNetCore": "Trace"
    }
  },
  "AllowedHosts": "*",
  "Jwt":{
    "Issuer": "localhost",
    "Audience": "",
    "Algorithm": "HS256",
    "AccessTokenExpiresMinutes": 15,
    "RefreshTokenExpiresHours": 12,
    "SecretKey": "secretKeysecretKeysecretKeysecretKeysecretKeysecretKeysecretKeyvsecretKeysecretKeysecretKey",
    "TokenNameInCookie": "jwtToken"
  }
}

Отравляю токен в виде хеддера, почему не валидный я не знаю, вроде все должно работтаь, audience и issuer не обезательны(делал без них на др проекте, работало).
  • Вопрос задан
  • 400 просмотров
Решения вопроса 1
Timur2342
@Timur2342 Автор вопроса
Я сам не понял как починил. Изменил я только конфигурацию (если точнее только переминовал "TokenNameInCookie" на "TokenNameInCookies" чтобы была привязка к свойству) и убрал лишнию "Bearer " в context.Token. Вот измененный код:
builder.Services.AddAuthentication(auth =>
{
    auth.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    auth.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer((opts) =>
{
    opts.RequireHttpsMetadata = false,

    opts.TokenValidationParameters = new TokenValidationParameters
    {
        ValidateIssuer = false, 
        //ValidIssuer = jwtOptions.Issuer,

        ValidateAudience = false, 
        //ValidAudience = jwtOptions.Audience, 

        ValidAlgorithms = new List<string> { jwtOptions.Algorithm }, 
        ValidateIssuerSigningKey = true,
        IssuerSigningKey = jwtOptions.GetSymmetricSecurityKey(),

        ValidateLifetime = true,
        LifetimeValidator = (notBefore, expires, securityToken, validationParameters) => 
        {
            if (expires != null)
                return expires.Value > DateTime.UtcNow;

            return false;
        },
        //Тут пишуться валидные значения, чтобы потом аут через токен(проверка на валидность)
    };
    opts.Events = new JwtBearerEvents
    {
        OnMessageReceived = async (context) =>
        {
            if (context is not null
                && string.IsNullOrEmpty(context.Token)
                && context.Request.Cookies.ContainsKey(jwtOptions.TokenNameInCookies)
                && context.Request.Cookies.TryGetValue(jwtOptions.TokenNameInCookies, out var token))
            {
                context.Token = token;
            }
            await Task.CompletedTask;
        }
    };
});

Токен ложу через Authorization header(swagger-ом), код отвечающий за то чтобы дать значение данному хеддеру я не изменял. И вот не понятно, почему раньше не работало когда в хеддере токен был а в куках нет?
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы