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

ASP.NET Core 8中如何从AddIdentityApi返回的Token获取用户信息

ASP.NET Core 8 AddIdentityApi返回无点令牌,SPA无法解析用户信息

问题背景

开发基于ASP.NET Core 8的客户端-服务器应用,采用JWT授权方案,使用.NET 8新增的AddIdentityApi扩展方法实现授权API端点。但遇到以下问题:

  • 登录接口返回的accessToken是无点分隔的长字符串,不是传统可读的三段式JWT
  • SPA端无法从令牌体中获取用户信息,尽管已授权请求的HttpContext.User包含所需全部用户信息

登录响应示例:

{
  "tokenType": "Bearer",
  "accessToken": "CfDJ8GwmsrOCkNBF ... ",
  "expiresIn": 3600,
  "refreshToken": "..."
}

问题原因

AddIdentityApi默认返回的是JWE(JSON Web Encryption)加密令牌,而非传统的JWS(JSON Web Signature)签名令牌。JWE是经过加密的完整字符串,没有JWS特有的点分隔结构,因此无法直接被客户端解析读取内容。框架默认使用JWE是为了保护令牌中的敏感用户数据,避免客户端直接获取到未加密的用户信息。

解决方案:配置返回未加密的JWS令牌

修改AddIdentityApiEndpoints的配置,指定令牌格式为JWS即可生成标准三段式可读JWT:

builder.Services.AddIdentityApiEndpoints<AppUser>(options =>
{
    // 指定使用JWS格式令牌,而非默认的JWE
    options.TokenFormat = JwtBearerTokenFormat.Jws;
})
.AddEntityFrameworkStores<AppIdentityDbContext>();

修改后的完整Program.cs代码:

using ICollector.Server.Data;
using ICollector.Server.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Identity; // 需引入该命名空间使用JwtBearerTokenFormat

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddDbContext<AppIdentityDbContext>(options =>
    options.UseSqlServer(builder.Configuration.GetConnectionString("mssql")
        ?? throw new InvalidOperationException("Connection string not found.")));

builder.Services.AddIdentityApiEndpoints<AppUser>(options =>
{
    options.TokenFormat = JwtBearerTokenFormat.Jws;
})
.AddEntityFrameworkStores<AppIdentityDbContext>();

builder.Services.AddAuthorization();

builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();

app.UseHttpsRedirection();

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}

app.UseDefaultFiles();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthentication();
app.UseAuthorization();

app.MapGroup("/api/identity").MapIdentityApi<AppUser>();

app.MapFallbackToFile("/index.html");

app.Run();

额外说明

  • 关于压缩:JwtTokenUtilities中的DecompressToken方法对应令牌压缩功能,默认情况下AddIdentityApi并未启用压缩。如果需要启用,可额外配置options.TokenCompressionAlgorithm = CompressionAlgorithms.Deflate;,但启用后客户端需要先解压才能解析令牌内容
  • 安全提示:JWS令牌内容是明文Base64Url编码的,客户端可以直接读取,因此不要在令牌中存放敏感信息。如果需要保护用户数据,建议保留默认的JWE格式,通过后端接口提供用户信息给SPA,而非让客户端解析令牌

内容的提问来源于stack exchange,提问作者Artiom

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 07:15:04