Azure App Service上ASP.NET Core Web API启用Easy Auth强制认证返回401
问题分析与解决指导
你的核心问题是App Service Easy Auth与ASP.NET Core自身身份验证的双重拦截冲突:当设置"要求认证"时,Easy Auth会在请求到达API控制器前先验证令牌,但当前配置未正确识别客户端凭证流生成的令牌,导致直接返回401。以下是具体解决步骤:
1. 修正Azure AD应用注册配置
- 确保API的应用注册(即
appsettings.json中Audience对应的应用)已暴露API范围,且生成令牌的客户端应用已添加该范围的应用权限(而非委派权限),并完成管理员同意。 - 验证客户端凭证流生成的令牌:用jwt.ms解析令牌,确认
aud(受众)字段与Audience完全一致(包括api://前缀),iss(颁发者)为https://login.microsoftonline.com/{TenantId}/v2.0(或v1.0,匹配应用注册的端点版本)。
2. 配置Easy Auth适配客户端凭证令牌
在Azure Portal的App Service「Authentication」面板中:
- 点击Microsoft身份提供商的「Edit」按钮,进入高级设置。
- 在「Allowed token audiences」中添加你的API受众地址(
api://xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)。 - 启用「Token store」,确保Easy Auth能正确解析令牌并将身份信息传递给后端API。
3. 调整ASP.NET Core验证逻辑(二选一)
方案A:保留Easy Auth全权处理验证
移除ASP.NET Core中的JWT验证配置,仅保留授权逻辑:
// Program.cs中删除以下代码 // builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) // .AddMicrosoftIdentityWebApi(builder.Configuration.GetSection("AzureAd")); // 保留以下代码 builder.Services.AddAuthorization(); app.UseAuthorization();
Easy Auth会自动将身份信息注入HttpContext,控制器上的[Authorize]特性依然生效。
方案B:让ASP.NET Core处理验证,Easy Auth做前置拦截
若需保留API自身的验证逻辑,需配置Easy Auth仅拦截未携带令牌的请求:
- 将Easy Auth的「未认证请求的处理操作」设置为「允许未认证请求」,但在API的
Program.cs中确保UseAuthentication()和UseAuthorization()顺序正确,通过[Authorize]特性强制验证。 - 同时在Easy Auth中配置「Allowed token audiences」,确保合法令牌能顺利通过前置拦截。
4. 测试验证
发送请求时确保Authorization头格式正确:Bearer {你的令牌},无多余空格或字符。测试通过后,再将Easy Auth的「未认证请求的处理操作」设回「要求认证」。
内容的提问来源于stack exchange,提问作者user2148124
相关产品推荐
相关产品推荐

