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

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();

关键说明

  1. 认证方案注册逻辑:
    • 先设置默认认证为CookieAuthenticationDefaults.AuthenticationScheme,适配Razor页面的会话式认证
    • 同时注册JwtBearer和OpenIdConnect两种认证方案,互不覆盖
  2. 授权策略区分:
    • 为API控制器创建ApiAuth策略,强制使用JwtBearer认证方案
    • Razor页面使用默认授权逻辑,自动走Cookie+OpenIdConnect流程
  3. 配置文件注意事项:
    • 确保appsettings.json中包含AzureAD(WebApp配置)和AzureADWebApi(WebApi配置)节点,两者的ClientId、TenantId等参数需匹配你的Azure AD应用注册信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 08:37:20