Атрибут фильтра авторизации возвращает ошибку ключа подписи, хотя он на 100 % верен.C#

Место общения программистов C#
Anonymous
Атрибут фильтра авторизации возвращает ошибку ключа подписи, хотя он на 100 % верен.

Сообщение Anonymous »

Я настраиваю авторизацию в своем проекте ASP.NET Core 8 и получаю эту ошибку при тестировании аутентификации токена JWT через Swagger:

content-length: 0 date: Sun, 12 апреля 2026 01:37:08 GMT-сервер: Kestrel www-authenticate: Bearer error="invalid_token",error_description="Ключ подписи не был нашел"

Я использовал:

Код: Выделить всё

JwtOptionsSetup:
using EasyPay.Application.DTOs.Auth;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Options;

namespace EasyPay.Application.OptionsSetup
{
public class JwtOptionsSetup : IConfigureOptions
{
private const string SectionName = "Jwt";
private readonly IConfiguration _configuration;

public JwtOptionsSetup(IConfiguration configuration)
{
_configuration = configuration;
}

public void Configure(JwtOptions options)
{
_configuration.GetSection(SectionName).Bind(options);
}
}
}

Код: Выделить всё

JwtBearerOptionsSetup:
using EasyPay.Application.DTOs.Auth;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.Text;

namespace EasyPay.Application.OptionsSetup
{
public class JwtBearerOptionsSetup : IConfigureOptions
{
private readonly JwtOptions _jwtOptions;

public JwtBearerOptionsSetup(IOptions jwtOptions)
{
_jwtOptions = jwtOptions.Value;
}

public void Configure(JwtBearerOptions options)
{
options.TokenValidationParameters = new()
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = _jwtOptions.Issuer,
ValidAudience = _jwtOptions.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.SecretKey))
};
}
}
}

Код: Выделить всё

JwtProvider:
using EasyPay.Application.DTOs.Auth;
using EasyPay.Application.Interfaces;
using EasyPay.Core.Entities;
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using System.Text;

namespace EasyPay.Application.Services.Auth
{
public class JwtProvider : IJwtProvider
{
private readonly JwtOptions _jwtOptions;

public JwtProvider(IOptions jwtOptions)
{
_jwtOptions = jwtOptions.Value;
}

public string Generate(User user)
{
var claims = new Claim[]
{
new Claim("userId", user.UserId.ToString()),
new Claim("email", user.Email)
};

var signingCredentials = new SigningCredentials(new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.SecretKey)), SecurityAlgorithms.HmacSha256);

var token = new JwtSecurityToken(_jwtOptions.Issuer, _jwtOptions.Audience, claims, null, DateTime.UtcNow.AddHours(1), signingCredentials);

string tokenValue = new JwtSecurityTokenHandler().WriteToken(token);

return tokenValue;
}
}
}
Внедрение зависимостей:

Код: Выделить всё

using EasyPay.Application.Interfaces;
using EasyPay.Application.OptionsSetup;
using EasyPay.Application.Services;
using EasyPay.Application.Services.Auth;
using EasyPay.Infrastructure.Database;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.OpenApi.Models;

namespace EasyPay.Application.Exceptions;

public static class ServiceDI
{
public static IServiceCollection AddServices(this IServiceCollection services, IConfiguration configuration)
{
services.AddControllers();
services.AddEndpointsApiExplorer();

services.AddSwaggerGen(option =>
{
option.SwaggerDoc("v1", new OpenApiInfo { Title = "EasyPay API", Version = "v1"  });
option.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
In = ParameterLocation.Header,
Description = "Please enter a valid token",
Name = "Authorization",
Type = SecuritySchemeType.Http,
BearerFormat = "JWT",
Scheme = "Bearer"
});
option.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{
new OpenApiSecurityScheme
{
Reference = new OpenApiReference
{
Type = ReferenceType.SecurityScheme,
Id = "Bearer"
}
},
new string[]{}
}
});
});

services.AddDbContext(options =>
{
options.UseNpgsql(configuration.GetConnectionString("DefaultConnection"));
});

services.AddScoped();
services.AddScoped();
services.AddScoped();
services.AddScoped();
services.AddScoped();
services.AddScoped();

services.AddRouting(options =>
{
options.LowercaseUrls = true;
});

services.ConfigureOptions();
services.ConfigureOptions();

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer();

return services;
}
}

Код: Выделить всё

appsettings.json:
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=easypay_db;User Id=secret;Password=secret;"
},
"Jwt": {
"Issuer": "EasyPay",
"Audience": "EasyPay",
"SecretKey": "[radacted]"
}
}
Можете ли вы помочь мне найти ошибку, пожалуйста, потому что я не могу найти ее при отладке

Вернуться в «C#»