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

