You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:48:31