授权过滤器属性返回了一个与签名密钥相关的错误,但它本身百分之百正确
我在ASP.NET Core 8项目中配置授权,在通过Swagger测试JWT令牌认证时,遇到了这个错误:
content-length: 0 date: Sun,12 Apr 2026 01:37:08 GMT server: 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<JwtOptions>
{
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<JwtBearerOptions>
{
private readonly JwtOptions _jwtOptions;
public JwtBearerOptionsSetup(IOptions<JwtOptions> 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 = 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<EPContext>(options =>
{
options.UseNpgsql(configuration.GetConnectionString("DefaultConnection"));
});
services.AddScoped<IUserService, UserService>();
services.AddScoped<IOrderService, OrderService>();
services.AddScoped<IProductService, ProductService>();
services.AddScoped<IGameService, GameService>();
services.AddScoped<IJwtProvider, JwtProvider>();
services.AddScoped<IAuthService, AuthService>();
services.AddRouting(options =>
{
options.LowercaseUrls = true;
});
services.ConfigureOptions<JwtOptionsSetup>();
services.ConfigureOptions<JwtBearerOptionsSetup>();
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]"
}
}
请帮我找出这个错误,因为我在调试时找不到它
解决方案
我找到了错误。出现在 JwtBearerOptionsSetup 类中。只是没有正确设置Bearer选项,因此后端无法验证。我的解决方法如下:
public void Configure(string? name, JwtBearerOptions options)
{
Configure(options);
}
我把这段代码添加到 JwtBearerOptionsSetup 类中,运行成功。
最终的 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 : IConfigureNamedOptions<JwtBearerOptions>
{
private readonly JwtOptions _jwtOptions;
public JwtBearerOptionsSetup(IOptions<JwtOptions> jwtOptions)
{
_jwtOptions = jwtOptions.Value;
}
public void Configure(string? name, JwtBearerOptions options)
{
Configure(options);
}
public void Configure(JwtBearerOptions options)
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = _jwtOptions.Issuer,
ValidAudience = _jwtOptions.Audience,
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_jwtOptions.SecretKey))
};
}
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。