如何在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集成请求的头映射
- 登录AWS控制台,进入API Gateway,找到目标API和对应的方法。
- 切换到集成请求标签页,滚动到HTTP头区域。
- 点击添加头,设置以下内容:
- 名称:自定义请求头名称(例如
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']。
- 名称:自定义请求头名称(例如
- 对所有需要传递的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
相关产品推荐
相关产品推荐

