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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 20:47:08