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

如何在ASP.NET Core 6 Web API中访问AWS自定义Lambda授权器添加的Claims?

解决方案:从Lambda授权器Context获取Claims到ASP.NET Core Web API

因为你使用的是API Gateway的HTTP代理集成,默认情况下Lambda授权器返回的Context不会自动转发到后端Web API,需要手动配置API Gateway将Context中的字段映射到请求头,之后Web API才能读取这些数据。

步骤1:配置API Gateway集成请求的头映射

  1. 登录AWS控制台,进入API Gateway,找到目标API和对应的方法。
  2. 切换到集成请求标签页,滚动到HTTP头区域。
  3. 点击添加头,设置以下内容:
    • 名称:自定义请求头名称(例如X-Claim-Sub、X-Claim-Roles,建议用统一前缀区分授权器传入的Claims)
    • 映射值:填写context.{ClaimType},其中ClaimType是你Lambda授权器中Context的键名(即Claim的Type)。如果ClaimType包含特殊字符(如斜杠、点),需要用方括号包裹,例如context['http://schemas.microsoft.com/ws/2008/06/identity/claims/role']。
  4. 对所有需要传递的Claim字段重复上述操作,保存配置并重新部署API。

步骤2:在ASP.NET Core Web API中获取Claims

配置完成后,Web API可以直接读取请求头,也可以通过中间件自动转换为ClaimsPrincipal:

直接读取请求头

// 在控制器或服务中获取
var sub = HttpContext.Request.Headers["X-Claim-Sub"].FirstOrDefault();
var roles = HttpContext.Request.Headers["X-Claim-Roles"].FirstOrDefault()?.Split(',');

中间件自动转换为ClaimsPrincipal

创建中间件,自动将自定义请求头转换为用户身份的Claims:

public class LambdaClaimsMiddleware
{
    private readonly RequestDelegate _next;

    public LambdaClaimsMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context)
    {
        var claims = new List<Claim>();
        // 遍历所有以X-Claim-开头的请求头
        foreach (var header in context.Request.Headers)
        {
            if (header.Key.StartsWith("X-Claim-", StringComparison.OrdinalIgnoreCase))
            {
                var claimType = header.Key["X-Claim-".Length..];
                // 处理逗号分隔的多值情况
                foreach (var value in header.Value)
                {
                    foreach (var splitValue in value.Split(','))
                    {
                        claims.Add(new Claim(claimType, splitValue.Trim()));
                    }
                }
            }
        }

        if (claims.Any())
        {
            var identity = new ClaimsIdentity(claims, "LambdaAuthorizer");
            context.User.AddIdentity(identity);
        }

        await _next(context);
    }
}

// 在Program.cs中注册中间件(放在认证中间件之后)
app.UseMiddleware<LambdaClaimsMiddleware>();

之后可直接通过HttpContext.User.Claims获取Claims:

var userName = User.FindFirst("name")?.Value;
var userRoles = User.FindAll(ClaimTypes.Role).Select(c => c.Value);

关键注意事项

  • 确保Lambda授权器中Context的键名与API Gateway映射值中的{ClaimType}完全一致,大小写敏感。
  • HTTP头名称不能包含特殊字符,若ClaimType有斜杠、空格等,建议映射时转换为合法名称(例如把http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier映射为X-Claim-NameIdentifier)。
  • 修改API Gateway配置后必须重新部署API,否则配置不会生效。

内容的提问来源于stack exchange,提问作者Pratik Patel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 17:35:33