.NET 8 Web API中使用AddBearerToken结合Identity API Endpoints如何设置IssuerSigningKey?
在ASP.NET Core Identity API Endpoints中配置Bearer Token签名密钥的正确方式
问题描述
我使用新版Identity API Endpoints特性开发Web API,在Next.js前端实现了仅认证用户可访问的受保护页面,并编写了verifyAuth函数通过密钥验证令牌:
export const verifyAuth = async (token: string) => { console.log("Token: ", token); try { const verified = await jwtVerify( token, new TextEncoder().encode(getJwtSecretKey()) ); return verified.payload as UserJwtPayload; } catch (error: any) { throw new Error("Your token has expired. Please login again."); } };
原本不使用Identity API Endpoints时,可以在JWT配置中直接设置IssuerSigningKey,但使用该特性时需要用AddBearerToken替代AddJwtBearer,当前的服务配置如下:
// Authentication builder.Services.AddAuthentication().AddBearerToken(); // Authorization with Identity endpoints builder.Services.AddAuthorizationBuilder(); builder.Services.AddIdentityApiEndpoints<IdentityUser>().AddEntityFrameworkStores<DatabaseContext>();
我注意到AddBearerToken有BearerTokenProtector选项,但不确定在此场景下如何设置签名密钥。请问该场景下应在哪里设置IssuerSigningKey?若我的思路有误,正确方案是什么?
解决方案
1. 直接通过AddBearerToken配置项指定签名密钥
AddBearerToken内置了直接配置签名密钥的选项,无需使用BearerTokenProtector(那是用于自定义令牌序列化逻辑的高级场景)。你只需在调用AddBearerToken时传入配置,设置TokenSigningKey即可:
builder.Services.AddAuthentication() .AddBearerToken(options => { // 从配置文件(如appsettings.json)读取密钥,也可从安全存储获取 var secretKey = builder.Configuration["Jwt:SecretKey"]; if (string.IsNullOrEmpty(secretKey)) { throw new InvalidOperationException("Jwt:SecretKey is not configured."); } options.TokenSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(secretKey)); });
配置完成后,Identity API Endpoints生成的Bearer Token会自动使用这个密钥签名,前端verifyAuth函数用相同密钥验证即可通过。
2. 关于BearerTokenProtector的正确使用场景
BearerTokenProtector是用于自定义令牌的保护逻辑,比如:
- 使用非对称加密算法(RSA)签名令牌
- 自定义令牌的序列化/反序列化格式
- 加入额外的令牌验证逻辑
普通对称密钥签名的场景完全不需要用到它,直接设置TokenSigningKey是最简洁的方案。
3. 关键注意事项
- 前后端使用的密钥必须完全一致:前端
getJwtSecretKey()返回的值要和后端配置的Jwt:SecretKey完全匹配 - 密钥必须具备足够的安全性:建议使用至少32位的随机字符串,避免使用弱密钥导致令牌被伪造
内容的提问来源于stack exchange,提问作者Marc Thieme
相关产品推荐
相关产品推荐

