ASP.NET Core7中同时使用AddMicrosoftIdentityWebApi与AddMicrosoftIdentityWebApp的问题
解决ASP.NET Core 7同时托管Azure AD保护的Web API和Razor页面的问题
你的核心问题是两次调用AddAuthentication覆盖了默认认证方案,导致API和Razor页面无法同时正常工作:
- 仅注册
AddMicrosoftIdentityWebApi时,默认认证方案是JwtBearer,Razor页面请求没有携带AccessToken,因此返回401 - 先注册WebApi再注册WebApp时,默认认证方案被覆盖为
OpenIdConnect,API请求会被重定向到Azure AD登录页,返回登录HTML
解决方案:配置多认证方案并路由区分
通过注册两种认证方案,为API和Razor页面分别指定认证策略,修改后的Program.cs代码如下:
using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authentication.OpenIdConnect; var builder = WebApplication.CreateBuilder(args); // 添加Razor Pages和Controllers服务 builder.Services.AddRazorPages(); builder.Services.AddControllers(); // 注册多认证方案:默认用Cookie(Razor页面),同时支持JwtBearer(API) builder.Services.AddAuthentication(options => { options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme; options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme; }) // 注册JwtBearer方案(API专用) .AddMicrosoftIdentityWebApi(builder.Configuration, JwtBearerDefaults.AuthenticationScheme) .EnableTokenAcquisitionToCallDownstreamApi() .AddMicrosoftGraph(builder.Configuration.GetSection("DownstreamApi")) .AddInMemoryTokenCaches() // 注册Cookie+OpenIdConnect方案(Razor页面专用) .AddMicrosoftIdentityWebApp(builder.Configuration); // 为API创建专属授权策略,强制使用JwtBearer认证 builder.Services.AddAuthorization(options => { options.AddPolicy("ApiAuth", policy => { policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme); policy.RequireAuthenticatedUser(); }); }); var app = builder.Build(); // 中间件配置 if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); // 为Razor页面和API分别配置授权规则 app.MapRazorPages().RequireAuthorization(); // 使用默认Cookie认证 app.MapControllers().RequireAuthorization("ApiAuth"); // 使用ApiAuth策略指定的JwtBearer认证 app.Run();
关键说明
- 认证方案注册逻辑:
- 先设置默认认证为
CookieAuthenticationDefaults.AuthenticationScheme,适配Razor页面的会话式认证 - 同时注册
JwtBearer和OpenIdConnect两种认证方案,互不覆盖
- 先设置默认认证为
- 授权策略区分:
- 为API控制器创建
ApiAuth策略,强制使用JwtBearer认证方案 - Razor页面使用默认授权逻辑,自动走Cookie+OpenIdConnect流程
- 为API控制器创建
- 配置文件注意事项:
- 确保
appsettings.json中包含AzureAD(WebApp配置)和AzureADWebApi(WebApi配置)节点,两者的ClientId、TenantId等参数需匹配你的Azure AD应用注册信息
- 确保
内容的提问来源于stack exchange,提问作者LeeAdama
相关产品推荐
相关产品推荐

