Microsoft ID Platform:React SPA+ASP.NET Core API的最优授权码流选型
问题解答
1. 适配的授权码流方案
你需要在AAD中注册两个独立应用:一个SPA类型应用,一个Web API类型应用,采用「SPA授权码流(带PKCE) + Web API承载令牌验证」的组合方案,具体逻辑如下:
- SPA端:使用授权码流(PKCE)向Microsoft Identity平台请求令牌,因为SPA是公共客户端(无法安全存储客户端密钥),PKCE是必须的安全机制。请求时要指定目标API的访问范围,拿到的
Access Token专门用于调用后端API,ID Token用于前端识别用户身份。 - API端:配置为接受Microsoft Identity平台颁发的承载令牌,验证令牌的签名、受众(Audience)、过期时间等合法性即可(ASP.NET Core的Microsoft Identity中间件会自动完成这部分验证)。
- SPA与API的通信:SPA调用API时,在HTTP请求头中携带
Authorization: Bearer {access_token},API端通过中间件自动解析并验证令牌,确认用户身份后,再用令牌中的用户唯一标识(比如oid或sub)关联你自有数据库中的权限数据,执行自定义授权逻辑。
这种方案不存在两个独立认证上下文的问题——令牌由同一个AAD实例颁发,API验证令牌后就能确认用户是经过AAD认证的合法用户,再结合你自己的权限体系做控制。
2. 是否需要配置AAD范围
是的,必须至少配置一个API范围,原因如下:
- AAD颁发的
Access Token需要明确的受众(Audience)和范围(Scope),否则API无法识别这个令牌是给自己的,会验证失败。你可以配置一个最基础的范围(比如access_as_user),不需要赋予具体权限含义,仅作为令牌与API绑定的标识。 - 你的自定义授权逻辑可以完全独立于AAD范围:API验证令牌合法后,提取用户的唯一标识(比如
oid),去自有数据库查询该用户的角色、权限,再通过业务逻辑过滤数据。AAD范围在这里仅起到“让令牌与API绑定”的作用,不参与你实际的权限判断。
关键配置要点
- 在AAD的Web API应用中添加一个范围,比如
api://{api-client-id}/access_as_user,启用“管理员和用户均可同意”。 - 在SPA应用的API权限中添加这个范围,并授予同意。
- SPA请求令牌时,将这个范围加入请求参数,确保拿到的
Access Token的aud字段匹配API的客户端ID,scp字段包含该范围。
内容的提问来源于stack exchange,提问作者metaldatarain
相关产品推荐
相关产品推荐

