ASP.NET Core 7.0集成Azure AD B2C后无法获取额外应用声明怎么办?
解决Azure AD B2C额外应用声明未出现在认证主体中的问题
1. 确认Azure AD B2C策略的声明配置
- 若使用用户流:
- 登录Azure AD B2C门户,打开你的注册登录流(如
B2C_1_susi) - 进入「用户属性」页面,确认你添加的额外属性已勾选「收集」和「返回」选项
- 进入「应用程序声明」页面,确保需要的额外声明已添加并启用
- 登录Azure AD B2C门户,打开你的注册登录流(如
- 若使用自定义策略:
- 检查RelyingParty节点的
OutputClaims,确保包含你的额外声明,示例:<OutputClaim ClaimTypeReferenceId="extension_CustomAttribute" /> - 同时确认对应的
ClaimType已在策略中定义,且在用户旅程中完成了收集或读取逻辑
- 检查RelyingParty节点的
2. 调整OpenID Connect配置以获取声明
修改Program.cs中的认证配置,开启UserInfo端点获取声明,并添加必要的声明映射:
builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApp(options => { builder.Configuration.Bind("AzureAdB2C", options); // 开启从UserInfo端点拉取扩展属性声明 options.GetClaimsFromUserInfoEndpoint = true; // 若需请求自定义API的权限范围,添加对应Scope options.Scope.Add("https://myb2c.onmicrosoft.com/api/your_custom_scope"); // 映射B2C返回的自定义声明到ClaimsPrincipal options.ClaimActions.MapJsonKey("extension_CustomAttribute", "extension_CustomAttribute"); });
3. 验证应用权限(针对自定义API声明)
如果额外声明来自自定义API:
- 在Azure AD B2C中为你的Web应用授予该API的相应权限
- 确保配置的
Scope列表中包含该API的权限范围(如上述代码示例)
4. 调试验证声明
- 在控制器中直接输出当前用户的所有声明,确认是否已获取:
public IActionResult Index() { var userClaims = User.Claims.Select(c => new { 声明类型 = c.Type, 声明值 = c.Value }); return View(userClaims); } - 解码ID Token(可本地使用jwt.io工具),检查Token本身是否包含目标声明:
- 如果Token里没有,说明B2C策略配置存在问题
- 如果Token里有但ClaimsPrincipal中没有,说明缺少声明映射配置
5. 注意自定义声明的前缀
Azure AD B2C的自定义属性声明默认带有extension_前缀,例如你创建的CustomAttribute,在返回的Token中会显示为extension_CustomAttribute,映射时必须使用完整名称。
内容的提问来源于stack exchange,提问作者JayZee
相关产品推荐
相关产品推荐

