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

Razor Pages中AllowAnonymous与OpenId Connect认证共存时失效问题

解决Razor Pages同时使用OIDC和JWT Bearer时AllowAnonymous页面返回401的问题

核心问题在于你两次调用了AddAuthentication,第二次调用会将默认认证scheme覆盖为JWT Bearer。当未登录用户访问标记了AllowAnonymous的页面时,认证中间件会使用默认的JWT Bearer scheme进行验证,由于没有携带JWT Token,直接返回401错误,而非触发OIDC的登录跳转流程。

修正步骤:

  1. 合并AddAuthentication配置,仅调用一次并指定默认scheme为OpenId Connect,同时添加两种认证方式
  2. 可选:为API端点单独配置使用JWT Bearer的授权策略

修正后的Program.cs代码:

// 仅调用一次AddAuthentication,设置默认认证scheme为OIDC
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(builder.Configuration) // 配置OIDC用于Razor Pages UI
    .AddMicrosoftIdentityWebApi(builder.Configuration); // 配置JWT Bearer用于API端点

builder.Services.AddAuthorization(options =>
{
    options.DefaultPolicy = new AuthorizationPolicyBuilder(OpenIdConnectDefaults.AuthenticationScheme)
        .RequireAuthenticatedUser()
        .Build();

    options.FallbackPolicy = options.DefaultPolicy;

    // 为API端点创建专属授权策略,指定使用JWT Bearer认证
    options.AddPolicy("ApiPolicy", policy =>
    {
        policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme)
              .RequireAuthenticatedUser();
    });
});

builder.Services.AddRazorPages()
    .AddRazorPagesOptions(options =>
    {
        options.Conventions.AllowAnonymousToFolder("/Diagnostics");
    })
    .AddMicrosoftIdentityUI();

补充说明:

  • 合并配置后,Razor Pages的未认证请求会默认使用OIDC处理,触发登录跳转;API端点则可以通过添加[Authorize(Policy = "ApiPolicy")]特性,指定使用JWT Bearer认证。
  • 确保你的API控制器或Action上使用该策略,比如:
    [ApiController]
    [Route("api/[controller]")]
    [Authorize(Policy = "ApiPolicy")]
    public class TestApiController : ControllerBase
    {
        // API方法
    }
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 15:22:43