Azure Functions中OpenID无法验证AD B2C签发的JWT,是配置问题还是Azure Bug?
Azure AD B2C与Azure Function EasyAuth颁发者验证不匹配问题分析
问题场景
- 已配置Azure AD B2C应用,包含
b2c_1_signupsignin用户流,其颁发者策略URL为https://xxxxxx.b2clogin.com/tfp/xxxxxxxx-a115-4371-a79d-63b6ac71ec44/b2c_1_signupsignin/v2.0/,登录后JWT的iss声明与该URL完全一致,aud声明也正确包含B2C应用ID。 - 在AAD租户的Azure Function中启用OpenID身份提供者,指定配置文档URL为
https://xxxxxx.b2clogin.com/tfp/xxxxxxxx-a115-4371-a79d-63b6ac71ec44/b2c_1_signupsignin/v2.0/.well-known/openid-configuration,确认该URL有效且返回的配置包含合法颁发者地址。 - 测试时持续返回401未授权,通过“身份验证配置与调查检测器(EasyAuth)”发现:JWT验证失败,期望的颁发者URL被截断了
/v2.0/部分,与JWT中的实际iss不符。
原因分析与解决办法
1. 核心原因
这是Azure EasyAuth针对B2C v2.0用户流的已知行为:EasyAuth会自动解析并截断颁发者URL中的/v2.0/后缀,导致与JWT中实际携带的iss声明不匹配,触发验证失败。
2. 可行解决方案
方案一:调整OpenID配置文档URL
将配置文档URL改为不带/v2.0/的版本:
https://xxxxxx.b2clogin.com/tfp/xxxxxxxx-a115-4371-a79d-63b6ac71ec44/b2c_1_signupsignin/.well-known/openid-configuration
该URL返回的配置中,颁发者地址会自动变为不带/v2.0/的格式,同时B2C颁发的JWT的iss声明也会同步调整为对应格式,与EasyAuth的期望匹配。
方案二:自定义颁发者验证规则
通过Azure Function的应用设置强制指定颁发者URL:
- 添加应用设置
WEBSITE_AUTH_OPENID_ISSUER,值设置为完整的颁发者URL(包含/v2.0/) - 该设置会覆盖EasyAuth自动解析的颁发者地址,强制使用指定值进行验证。
方案三:保留手动验证(当前已采用)
手动验证时可在代码中直接核对iss声明,不受EasyAuth自动解析逻辑的限制,适合需要自定义验证逻辑的场景。
总结
此问题并非配置遗漏,属于Azure EasyAuth针对B2C v2.0用户流的已知解析行为,通过调整配置URL或添加自定义应用设置即可解决。
内容的提问来源于stack exchange,提问作者Mischa
相关产品推荐
相关产品推荐

