AngularJS应用调用ASP.NET Core API需传AuthToken还是IDToken?
ASP.NET Core Web API Token使用问题解答
客户端调用API的Token选择
Angular/AngularJS客户端发起API请求时,必须携带Access Token(即你提到的Auth Token),禁止将ID Token作为鉴权凭证发送给后端API。
你的现有配置已经正确接入了微软身份平台的Web API鉴权逻辑,只要Token校验通过,你在控制器中可以直接通过以下代码提取email声明:
[Route("[controller]")] public class UserController : ControllerBase { [HttpGet] public IActionResult Get() { // 直接从User对象中读取email声明 var userEmail = User.FindFirstValue("email"); // 后续根据邮箱查询数据库返回用户信息即可 ... } }
如果提取不到email声明,去Entra ID(原AAD)的应用注册页面,给你的API配置可选声明,要求身份提供商将email字段下发到Access Token中即可。
三类Token的适用场景
OpenID Connect构建于OAuth2协议之上,不同Token的定位和使用边界完全不同:
- Access Token(Auth Token):OAuth2协议定义的资源访问凭证,专门用于调用受保护的后端资源(包括你自己开发的Web API、身份提供商提供的官方接口比如/userinfo)。API侧的鉴权中间件会校验这个Token的签名、受众、有效期,校验通过后会自动解析Token内的声明,填充到请求上下文中供业务逻辑使用。
- ID Token:OpenID Connect扩展的身份凭证,固定为JWT格式,受众是发起登录流程的客户端应用本身,仅用于客户端本地确认用户登录状态、获取基础身份信息做前端页面渲染、前端路由拦截使用,不能作为调用后端API的凭证。
- Refresh Token:仅面向可信的移动端、桌面端、服务端应用发放,无固定过期时间但支持手动吊销,作用是在Access Token过期后,无需用户重新交互登录即可换取新的Access Token和ID Token。前端单页应用(如Angular项目)属于不可信客户端,不建议存储和使用Refresh Token,存在令牌泄露风险。
核心疑问解答:读取声明是否必须使用Access Token
是否使用Access Token取决于读取声明的主体是谁:
- 如果是后端API需要读取声明做鉴权、业务逻辑处理:必须使用Access Token。ID Token的受众是前端客户端,你的Web API鉴权中间件校验ID Token时会直接抛出受众不匹配的错误,请求无法进入业务逻辑。
- 如果是前端客户端需要读取声明做前端交互逻辑:直接解析登录流程返回的ID Token即可,不需要使用Access Token。
- 如果Access Token中缺少需要的声明,不要尝试用ID Token绕过校验,正确做法是去身份提供商的配置后台,将需要的字段配置为API的可选声明,让身份提供商在签发Access Token时直接携带对应字段即可。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

