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

ASP.NET Core项目用Microsoft Identity Platform同时支持Web应用与API鉴权可行吗

解决方案

问题根因

你的推测完全正确:多次调用带参数的AddAuthentication(默认方案名)时,后续调用会覆盖全局默认的认证方案,导致前面注册的交互式登录OpenIdConnect配置失效,所有请求都会默认走JWT认证逻辑,普通页面请求没有JWT令牌自然返回401。

同项目同时支持Web应用和API的配置方法

完全不需要拆分项目,按以下步骤修改配置即可:

1. 调整认证服务注册逻辑

不要重复调用带默认方案参数的AddAuthentication,改为先注册Web应用的默认认证逻辑,再追加注册API用的JWT认证方案:

// 全局默认认证方案使用Web应用的交互式OpenIdConnect
services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
        .EnableTokenAcquisitionToCallDownstreamApi()
        .AddInMemoryTokenCaches();

// 无参数调用AddAuthentication,仅新增JWT认证方案,不覆盖全局默认配置
services.AddAuthentication()
        .AddMicrosoftIdentityWebApi(
            Configuration.GetSection("AzureAd"), 
            jwtBearerScheme: JwtBearerDefaults.AuthenticationScheme
        );

2. 为API接口指定专属认证方案

给所有API控制器单独指定使用JWT认证方案即可,普通Web页面控制器不需要额外配置,沿用默认的OpenIdConnect认证:

[ApiController]
[Route("api/[controller]")]
// 明确指定API接口使用JWT认证
[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
public class SampleApiController : ControllerBase
{
    // 接口实现
}

若选择拆分项目的共享方案

如果后续出于业务隔离需要拆分为两个独立项目,共享数据库和模型的实现方式也非常简单:

  • 将实体模型、数据访问层(DbContext、仓储逻辑等)单独封装为一个.NET类库项目
  • Web应用项目和API项目都引用该公共类库,两个项目的数据库连接字符串配置为同一个值即可
  • Azure AD侧可以使用同一个应用注册,分别配置Web平台重定向地址和API暴露的作用域,也可以分开注册两个应用,根据业务需求选择即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 22:15:06