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

使用OIDC资源服务器保护.NET API时传有效Bearer Token仍跳转登录页

解决方案

核心问题

你误用了面向交互式Web应用的OpenIdConnect认证方案配置API项目。该方案默认用于需要用户跳转登录的网页场景,只要请求未通过认证就会触发302重定向到OIDC登录页,完全不符合API接收Authorization: Bearer令牌校验的需求。

修改方法

推荐方案:替换为JWT Bearer认证(标准API认证方式)

  • 先安装对应的NuGet包:Microsoft.AspNetCore.Authentication.JwtBearer
  • 移除原有AddOpenIdConnect相关配置,替换为如下认证配置:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        // 填你原有的OIDC授权服务器地址
        options.Authority = configuration["Contonso:Oidc:Authority"];
        // 填API对应的资源标识(Audience),一般在OIDC服务中配置API资源时定义
        options.Audience = configuration["Contonso:Oidc:ApiAudience"];
        // 令牌校验规则,按需调整
        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true
        };
    });
  • 确保中间件顺序正确,Program.cs里必须先注册app.UseAuthentication(),再注册app.UseAuthorization(),顺序错误会导致校验失效。

临时兼容方案:保留OpenIdConnect配置时禁止重定向(不推荐)

如果特殊场景需要保留原OpenIdConnect配置,可以添加事件拦截重定向逻辑,API请求直接返回401状态码而非跳转:

return builder.AddOpenIdConnect("contonso", options =>
{
    // 你原有其他配置不变,新增如下事件
    options.Events.OnRedirectToIdentityProvider = context =>
    {
        if (context.Request.Path.StartsWithSegments("/api"))
        {
            context.Response.StatusCode = StatusCodes.Status401Unauthorized;
            return Task.CompletedTask;
        }
        return Task.CompletedTask;
    };
});

内容的提问来源于stack exchange,提问作者Arnaud F.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 17:45:04