验证Azure AD B2C生成的JWT令牌的密钥获取及验证失败问题
解决思路
- 修正OpenID配置端点使用错误
你此前使用的是通用Azure AD的OpenID配置端点,并不匹配Azure AD B2C的签发规则,正确的配置端点格式为https://{你的B2C租户名}.b2clogin.com/{你的B2C租户名}.onmicrosoft.com/{你实际使用的用户流名称}/v2.0/.well-known/openid-configuration,从该端点返回结果中获取jwks_uri字段对应的地址,即可拿到B2C用于签名令牌的公钥集合。 - 修正签名算法使用错误
你当前代码中使用HMACSHA256Algorithm对称加密算法做校验是完全错误的:Azure AD B2C签发的JWT令牌采用RS256非对称签名算法,不存在你代码里需要填写的对称密钥,你只需要用从jwks接口拿到的对应公钥,搭配RS256算法即可完成签名校验。 - 更简便的实现方案
不需要手动编写令牌校验逻辑,直接在Azure门户的Function App配置页开启「身份验证」功能,选择Azure AD B2C作为身份提供者,按提示填写租户信息、用户流、应用ID等参数,Azure Functions平台会自动完成全流程的令牌校验,你直接从请求上下文的ClaimsPrincipal中提取用户声明即可,稳定性远高于自定义校验逻辑。 - 自定义校验的补充注意事项
如果你坚持要自己实现校验,需要额外完成以下逻辑:
- 解析JWT头部的
kid字段,从公钥集合中匹配对应kid的公钥,不要直接拿整个x5c字段使用 - 除了签名校验,必须同时校验令牌的
iss(签发者)、aud(受众)、exp(过期时间)字段,避免安全风险 - 公钥可以长期缓存,不需要每次请求都拉取jwks接口
内容的提问来源于stack exchange,提问作者Marco Jr
相关产品推荐
相关产品推荐

