.NET 6 JwtBearer认证:如何用Access Token获取额外用户信息
.NET 6中借助现有JWT获取额外用户信息的内置方案
.NET 6提供了内置机制实现这个需求,核心是通过JWT Bearer认证的事件扩展,结合OpenID Connect(OIDC)的UserInfo端点,用已验证的Access Token获取额外用户信息并注入到认证上下文。
实现步骤
1. 扩展JwtBearer的认证事件
在AddJwtBearer配置中,通过Events属性的OnTokenValidated事件,在Token验证通过后调用授权服务器的UserInfo端点,将获取到的额外信息添加到ClaimsPrincipal中。
2. 调用UserInfo端点
确保授权服务器暴露标准OIDC的UserInfo端点,使用已验证的Access Token作为请求凭证(部分服务器需要显式在请求头中携带Token)。
修改后的配置代码示例
// 先注册HttpClientFactory,用于调用UserInfo端点 services.AddHttpClient(); services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, jwt => { jwt.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidIssuer = "你的授权服务器地址", // 示例:https://your-oidc-server.com ValidateAudience = true, ValidAudience = "你的API受众标识", ValidateLifetime = true, IssuerSigningKeys = // 配置签名验证密钥(可从授权服务器JWKS端点获取) }; jwt.Events = new JwtBearerEvents { OnTokenValidated = async context => { // 获取当前已验证的Access Token var accessToken = context.SecurityToken as JwtSecurityToken; if (accessToken == null) return; // 调用授权服务器的UserInfo端点 var httpClient = context.HttpContext.RequestServices.GetRequiredService<IHttpClientFactory>().CreateClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken.RawData); var userInfoResponse = await httpClient.GetAsync("https://your-oidc-server.com/connect/userinfo"); if (!userInfoResponse.IsSuccessStatusCode) { context.Fail("获取用户额外信息失败"); return; } // 解析响应内容(可替换为强类型模型适配实际返回结构) var userInfo = await userInfoResponse.Content.ReadFromJsonAsync<Dictionary<string, object>>(); if (userInfo == null) return; // 将额外信息添加到当前用户的Claims集合 var claimsIdentity = context.Principal.Identity as ClaimsIdentity; foreach (var kvp in userInfo) { claimsIdentity?.AddClaim(new Claim(kvp.Key, kvp.Value?.ToString() ?? string.Empty)); } } }; });
关键说明
- 需确保授权服务器允许你的API客户端调用UserInfo端点,且Access Token包含
profile等必要权限范围(Scope) - 可根据业务需求将UserInfo解析逻辑替换为强类型模型,提升代码健壮性
- 若授权服务器的UserInfo端点有特殊请求格式要求,可自行调整HttpClient的请求配置
内容的提问来源于stack exchange,提问作者user2966445
相关产品推荐
相关产品推荐

