Razor Pages中AllowAnonymous与OpenId Connect认证共存时失效问题
解决Razor Pages同时使用OIDC和JWT Bearer时AllowAnonymous页面返回401的问题
核心问题在于你两次调用了AddAuthentication,第二次调用会将默认认证scheme覆盖为JWT Bearer。当未登录用户访问标记了AllowAnonymous的页面时,认证中间件会使用默认的JWT Bearer scheme进行验证,由于没有携带JWT Token,直接返回401错误,而非触发OIDC的登录跳转流程。
修正步骤:
- 合并
AddAuthentication配置,仅调用一次并指定默认scheme为OpenId Connect,同时添加两种认证方式 - 可选:为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
相关产品推荐
相关产品推荐

