Azure AD B2C JWT签名验证失败问题排查请求
我来帮你搞定这个签名验证失败的问题,这类问题大多卡在配置细节或者令牌属性不匹配上,咱们一步步来梳理:
1. 补全并核对Authority配置的正确性
你代码里的Authority写到一半了,完整的Azure AD B2C Authority格式应该是这样的:
jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{tenant}/{policy}/v2.0/";
或者现在更推荐的新域名格式:
jwtOptions.Authority = $"https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/v2.0/";
如果漏掉了/v2.0/这个路径,WebAPI会找不到正确的签名密钥端点,直接导致验证失败。
2. 核对令牌的Issuer(签发者)与配置是否匹配
把你的JWT令牌拿到jwt.io上解码(本地打开工具即可,无需跳转外部网站),查看iss字段的值,然后和你配置的Authority拼接后的Issuer完全对比——包括域名、租户名、策略名、路径,大小写都不能错。比如租户是contoso.onmicrosoft.com,策略是B2C_1_signupsignin,那Issuer应该是https://login.microsoftonline.com/tfp/contoso.onmicrosoft.com/B2C_1_signupsignin/v2.0/,必须完全一致。
3. 确认签名密钥能正常获取
AddJwtBearer会自动从Authority的/.well-known/openid-configuration/jwks端点拉取签名密钥。你可以手动访问这个端点(把完整Authority后面加上/.well-known/openid-configuration/jwks),看看能不能返回有效的JWKS(JSON格式的密钥集合数据)。如果访问失败,要么是Authority配置错误,要么是网络问题导致WebAPI拉不到密钥。
4. 检查令牌的签名算法是否被支持
解码令牌看alg字段,Azure AD B2C默认用的是RS256,WebAPI的AddJwtBearer默认支持这个算法,但如果你的令牌用了其他算法(虽然B2C一般不会这么配置),需要手动指定支持的算法:
jwtOptions.TokenValidationParameters = new TokenValidationParameters { ValidAlgorithms = new[] { SecurityAlgorithms.RsaSha256 } };
5. 确保ClientId是WebAPI的应用ID
这里要注意:配置里的clientId必须是你在Azure AD B2C里注册的WebAPI应用程序的ID,而不是前端客户端应用的ID。解码令牌看aud(受众)字段,这个值必须和配置里的ClientId完全匹配,否则验证会直接失败。
6. 检查令牌是否过期或被篡改
解码令牌看exp字段(过期时间,是Unix时间戳),确认当前时间在过期时间之前。另外,如果令牌被篡改过,签名验证肯定通不过,所以要确保令牌是从Azure AD B2C正常获取的,没有被修改过。
7. 开启详细日志抓取具体错误
如果上面的步骤都没问题,那就开启详细日志看具体报错。在你的appsettings.json里添加这段配置:
{ "Logging": { "LogLevel": { "Microsoft.AspNetCore.Authentication": "Debug", "Microsoft.IdentityModel": "Debug" } } }
然后运行WebAPI,查看日志里的认证相关错误信息——日志会明确告诉你是Issuer不匹配、Audience不对,还是密钥获取失败,直接定位问题根源。
内容的提问来源于stack exchange,提问作者user3501292

