使用Azure应用服务身份验证(Easy Auth)保护API时如何获取用户请求作用域?
解决Easy Auth下无法获取JWT作用域的问题
我之前也踩过这个坑!当咱们用JwtBearer中间件处理身份验证时,确实可以通过这段代码顺利拿到令牌里的作用域:
var scopes = HttpContext.User.FindFirst("http://schemas.microsoft.com/identity/claims/scope")?.Value; if (scopes != null && scopes.Split(' ').Any(s => s.Equals("app.read"))) { // 这里写你的授权逻辑 }
但一旦把JwtBearer中间件的代码注释掉,单纯依赖Easy Auth来做身份校验时,就会发现根本获取不到这个作用域声明。
这背后的原因是:Easy Auth默认不会把scope这个JWT声明映射到HttpContext.User的Claims集合里。要解决这个问题,有两个实用的办法:
手动解析原始令牌:从Easy Auth注入的请求头里拿到原始ID令牌,用JWT库直接解析出作用域。示例代码如下:
using System.IdentityModel.Tokens.Jwt; var idTokenHeader = HttpContext.Request.Headers["X-MS-TOKEN-AAD-ID-TOKEN"].FirstOrDefault(); if (!string.IsNullOrWhiteSpace(idTokenHeader)) { var jwtHandler = new JwtSecurityTokenHandler(); var jwtToken = jwtHandler.ReadJwtToken(idTokenHeader); var scopes = jwtToken.Claims.FirstOrDefault(c => c.Type == "scope")?.Value; if (scopes != null && scopes.Split(' ').Contains("app.read")) { // 执行你的授权逻辑 } }配置Easy Auth的声明传递:如果你用的是Azure App Service的Easy Auth,可以在应用的身份验证配置里,找到并勾选**"Include token claims in response headers"**选项。开启后,令牌里的声明会被自动放到请求头中,你也可以直接从对应头字段读取作用域信息。
内容的提问来源于stack exchange,提问作者Jussi Palo
相关产品推荐
相关产品推荐

