从AAD B2C升级至Microsoft Entra External ID后,集成测试认证时出现'resource'参数缺失错误的求助
我来帮你拆解并解决这个问题,你碰到的AADSTS900144: The request body must contain the following parameter: 'resource'错误,本质是MSAL请求和Entra External ID(B2C)的认证规则不匹配导致的,咱们一步步来修复:
核心问题根源
这个错误是因为你的请求触发了v1.0版认证终结点的逻辑——v1流程强制要求传resource参数,但Entra B2C默认使用v2.0终结点,依赖scopes参数来声明权限。你当前代码里用了通用的WithOidcAuthority,没有适配B2C专属的认证配置,才会出现这个参数不兼容的问题。
具体修复步骤
1. 替换B2C专属的Authority配置方法
把代码里的WithOidcAuthority改成MSAL专门为B2C设计的WithB2CAuthority,这个方法会自动适配B2C的v2.0终结点格式,避免触发v1的resource参数要求:
IPublicClientApplication app = PublicClientApplicationBuilder .Create(clientId) .WithExperimentalFeatures() .WithB2CAuthority(authority) // 替换原有的WithOidcAuthority .WithRedirectUri("https://localhost") .Build();
注意:你的authority格式必须是Entra B2C的标准格式:https://<你的租户名>.b2clogin.com/<你的租户名>.onmicrosoft.com/<你的用户流名称>/v2.0/,比如https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_signupsignin/v2.0/
2. 修正Scopes的正确配置
B2C场景下,User.Read这类Microsoft Graph权限默认是不生效的(除非你专门在用户流/自定义策略里集成了Graph),集成测试里更推荐用你自己API的.default范围,这是B2C里获取应用级权限的标准方式:
string[] scopes = new string[] { "api://<你的API应用ID>/.default" };
同时要确保这3个前置配置:
- 在你的API应用注册的「Expose an API」页面,已经添加了
api://<你的API应用ID>/.default这个范围 - 在API应用的「API permissions」页面,给测试用的客户端应用(即代码里
clientId对应的应用)添加了这个权限,并且点击「Grant admin consent for <租户名>」完成管理员授权 - 测试用户已经被分配了对应的API权限(如果你的API权限设置为需要用户分配的话)
3. 验证用户流/自定义策略的兼容性
如果用的是自定义策略,要确保authority指向自定义策略的终结点;如果是用户流,确认用户流的「Token compatibility settings」里默认启用了v2.0格式(默认就是v2,一般不用改)。
额外优化建议
- 集成测试里没必要用
User.Read这类Graph权限,直接用自己API的.default范围更贴合测试场景 - 确认测试用户是在Entra B2C租户内创建的,而非外部用户(除非你的测试场景明确需要外部用户)
内容来源于stack exchange

