AddMicrosoftIdentityWebApi如何验证Bearer令牌?无客户端密钥为何可信?
关于SPA无客户端密钥时后端信任Access Token的机制说明
为什么SPA场景不需要客户端密钥
SPA属于公开客户端(Public Client),无法安全存储客户端密钥(代码在浏览器中运行,密钥易被提取),因此Azure AD对这类客户端不要求提供密钥,转而通过令牌本身的合法性校验来确保安全。
AddMicrosoftIdentityWebApi中的令牌验证机制
这个方法已经封装了完整的JWT令牌校验逻辑,核心步骤如下:
自动获取Azure AD公钥验证签名
- 它会从Azure AD的OpenID配置元数据端点(格式为
{Instance}{TenantId}/v2.0/.well-known/openid-configuration)自动获取公钥。 - 用该公钥验证Access Token的签名,确保令牌由Azure AD签发且未被篡改(只有Azure AD持有对应私钥,能生成合法签名)。
- 它会从Azure AD的OpenID配置元数据端点(格式为
校验令牌核心属性
自动验证以下关键属性,确保令牌合法有效:- 签发者(Issuer):必须匹配配置中
Instance+TenantId组成的地址,保证令牌来自指定的Azure AD租户。 - 受众(Audience):必须与配置中的
ClientId一致,确保令牌是颁发给当前Web API的。 - 过期时间(ExpiresAt):检查令牌是否已过期,拒绝过期令牌。
- 签名算法:确保使用非对称加密算法(如RS256),避免对称算法带来的密钥泄露风险。
- 客户端标识(azp/appid):验证令牌的颁发对象是合法的SPA客户端(默认会校验,也可通过配置进一步限制)。
- 签发者(Issuer):必须匹配配置中
依赖底层JwtBearer中间件
AddMicrosoftIdentityWebApi本质是对ASP.NET Core JwtBearer中间件的封装,所有验证逻辑最终由JwtBearer中间件执行,它会自动配置TokenValidationParameters参数,把上述校验规则注入进去,无需手动编写验证代码。
补充:SPA的令牌获取安全机制
SPA使用Authorization Code Flow with PKCE(授权码流+PKCE)获取令牌,这个流程不需要客户端密钥:
- PKCE会生成随机的
code_verifier和对应的code_challenge,授权请求中发送code_challenge,获取授权码后用code_verifier兑换令牌,防止授权码被拦截盗用,确保令牌获取过程的安全性。
内容的提问来源于stack exchange,提问作者Daniel Harrison
相关产品推荐
相关产品推荐

