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
相关产品推荐
相关产品推荐

