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
相关产品推荐
相关产品推荐

