Почему jwt токен не проходит проверку на валидность?

Как я могу настроить аутентификацию по токену в ASP.NET Core, включая валидацию токена и генерацию токена для пользователя?
  • 15 июня 2024 г. 1:11
Ответы на вопрос 2
JWT токен может не проходить проверку на валидность по следующим причинам:

1. Истек срок действия токена - проверьте время жизни токена и его срок действия.
2. Неправильно сформированный токен - убедитесь, что токен был правильно подписан и содержит все необходимые данные.
3. Проблемы с ключом подписи - проверьте, что используемый ключ для подписи токена соответствует ключу, указанному при валидации токена.

Чтобы настроить аутентификацию по токену в ASP.NET Core, включая валидацию и генерацию токена, вам необходимо выполнить следующие шаги:

1. Установите необходимые пакеты NuGet:
```
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
```

2. В `Startup.cs` добавьте настройку аутентификации:
```csharp
services.AddAuthentication(options => {
    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
    options.DefaultchallengeScheme = JwtBearerDefaults.AuthenticationScheme;
}).AddJwtBearer(options => {
    options.Authority = "https://your-domain";
    options.Audience = "your-audience";
});
```

3. В контроллере добавьте атрибут `[Authorize]` для проверки аутентификации:
```csharp
[Authorize]
public class YourController : ControllerBase
{
    // Код контроллера
}
```

4. Создайте генерацию токена для пользователя с помощью библиотеки, такой как `System.IdentityModel.Tokens.Jwt`.
```csharp
var secret = "your-secret-key";
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secret));
var credentials = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(
    issuer: "your-issuer",
    audience: "your-audience",
    expires: DateTime.Now.AddHours(1),
    signingCredentials: credentials
);

var tokenString = new JwtSecurityTokenHandler().WriteToken(token);
```

Подробнее о настройке аутентификации по токену в ASP.NET Core вы можете прочитать в официальной документации Microsoft: https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity-api-authorization?view=aspnetcore-5.0
Я сам не понял как починил. Изменил я только конфигурацию (если точнее только переминовал "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-ом), код отвечающий за то чтобы дать значение данному хеддеру я не изменял. И вот не понятно, почему раньше не работало когда в хеддере токен был а в куках нет?
Похожие вопросы