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

.NET 7 Web API集成外部OIDC后内部API认证方案咨询

解决方案与建议

核心结论

直接使用外部OIDC提供商颁发的Access Token认证内部.NET 7 Web API是合规且可行的,和你之前用Azure AD的逻辑完全一致。你的现有配置问题在于误用了AddOpenIdConnect——这个方法是给交互式客户端(如MVC、Blazor应用)发起授权码流程用的,Web API作为资源服务器,应该用AddJwtBearer来验证JWT令牌。


1. 修正Web API认证配置

替换原有AddOpenIdConnect配置为AddJwtBearer,让API直接验证外部OIDC令牌的有效性:

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.Authority = "REDACTED"; // 外部OIDC提供商的Issuer地址(如https://xxx.auth0.com/)
        options.Audience = "REDACTED"; // 你的API在OIDC提供商注册的ClientId,或令牌指定的Audience
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true
        };
        // 保存原令牌,方便后续调用其他外部API
        options.Events = new JwtBearerEvents
        {
            OnTokenValidated = context =>
            {
                var rawToken = context.Request.Headers["Authorization"].ToString().Replace("Bearer ", "");
                context.HttpContext.Items["ExternalAccessToken"] = rawToken;
                return Task.CompletedTask;
            }
        };
    });

// 必须添加授权中间件
builder.Services.AddAuthorization();

// 管道中启用认证和授权
app.UseAuthentication();
app.UseAuthorization();

2. 关于"直接用Code认证API"的误区

外部提供商返回的code是授权码,仅用于客户端向OIDC服务器交换Access Token/ID Token,不能直接作为API的认证凭证。正确流程是:客户端用code交换到Access Token后,在请求内部API时携带该令牌(放在Authorization: Bearer {token}头中)。


3. 是否需要签发自有API令牌?

分两种场景判断:

  • 不需要(推荐):如果外部令牌的有效期、权限声明能满足内部API需求,直接用最简洁,无需额外开发令牌签发逻辑。
  • 需要:如果内部系统有复杂权限控制、统一令牌格式要求,或外部令牌有效期过短,可在验证外部令牌后签发自有JWT:
    1. 新增一个令牌签发端点,接收外部Access Token
    2. 验证外部令牌有效性(用上述AddJwtBearer的逻辑)
    3. 签发自有JWT,同时将外部令牌存入自有令牌的Claims或请求上下文
    4. 后续内部API验证自有JWT,调用外部API时取出存储的原令牌

4. 令牌过期处理

  • 直接用外部令牌:客户端需管理Refresh Token,在Access Token过期前主动向OIDC提供商刷新令牌。
  • 用自有令牌:可在自有令牌中携带外部Refresh Token,当自有令牌过期时,服务端自动刷新外部令牌并重新签发自有令牌。

注意事项

  • 确认外部OIDC提供商颁发的是JWT格式令牌:如果是不透明令牌(Opaque Token),需调用提供商的令牌 introspection 端点验证有效性,可在AddJwtBearer的事件中自定义验证逻辑。
  • 检查外部令牌的aud(受众)字段:必须包含你的API的ClientId,或提供商支持配置自定义受众。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 01:02:31