Azure AD B2C:为何不能用登录返回的AccessToken保护REST Web API?
核心原因在于Azure AD B2C颁发的令牌是针对特定受众和用途设计的,直接复用SPA的令牌会在验证、权限控制上出现本质问题:
受众不匹配:你从SPA登录拿到的AccessToken,其
aud(受众)字段值是SPA的B2C应用ID。而Web API验证令牌时,会强制检查aud是否等于自己的应用ID(也就是单独注册的API应用ID),不匹配会直接拒绝请求——这是OAuth2和OpenID Connect的核心安全机制,确保令牌只能被目标资源使用,防止令牌被滥用。权限范围无效:SPA的令牌里的
scope字段是SPA申请的权限(比如openid、profile这类用户信息权限),并不包含Web API定义的专属访问范围。Web API需要验证令牌里是否包含自己定义的权限(比如api://<API-APP-ID>/access_as_user),没有这些专属范围的话,API无法确认用户是否有权限调用它。安全边界模糊:给Web API单独注册应用,相当于给这个资源设定了独立的安全身份。这样你可以针对不同客户端(比如SPA、移动端APP)配置不同的API访问权限,也能单独管理API的令牌策略(比如令牌有效期、刷新规则)。如果复用SPA的令牌,API的安全策略会和SPA绑定,失去独立管控的能力,一旦SPA出现安全问题,API也会直接暴露风险。
令牌用途定位不同:Azure AD B2C给SPA颁发的AccessToken主要用于SPA自身的身份验证(比如获取用户信息),而非作为访问第三方资源的凭证。专门为API申请的令牌才是符合OAuth2中「资源访问令牌」的设计,它携带了API所需的所有身份和权限信息。
简单说,不是技术上完全做不到(比如硬改验证逻辑忽略aud和scope),但这么做会彻底破坏OAuth2的安全模型,导致API的权限控制失效,也完全违背Azure AD B2C的设计规范。
内容的提问来源于stack exchange,提问作者Jayesh Jethva

