You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:24:13