如何将Lambda Authorizer上下文值传递至.NET 6 Minimal API自定义请求头
一、先搞懂数据怎么传的
在API Gateway的Lambda代理集成模式下,Lambda Authorizer返回的context不会自动变成HTTP请求头,而是被打包在API Gateway发给Lambda的请求事件里,具体位置是APIGatewayProxyRequest.RequestContext.Authorizer字段。
二、两种实现方式
1. 直接在接口里读取(快速实现)
如果只是个别接口需要用这些context值,直接在接口方法里获取即可:
首先确保你的Lambda函数用的是代理集成的标准请求/响应对象:
using Amazon.Lambda.APIGatewayEvents; using Amazon.Lambda.Core; // 指定Lambda序列化器,避免数据解析问题 [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); app.MapGet("/your-endpoint", (APIGatewayProxyRequest request) => { // 从Authorizer上下文里拿数据 var authorizerData = request.RequestContext.Authorizer; var companyId = authorizerData["company_id"]?.ToString(); var owner = authorizerData["Owner"]?.ToString(); // 后续业务逻辑用这些值就行 return Results.Ok(new { CompanyId = companyId, RequestedBy = owner }); }); app.Run();
2. 全局转为请求头(多接口场景推荐)
如果多个接口都需要用这些值,建议加个中间件把context数据转成请求头,这样所有接口都能通过HttpContext直接读取:
using Amazon.Lambda.APIGatewayEvents; using Amazon.Lambda.Core; [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))] var builder = WebApplication.CreateBuilder(args); var app = builder.Build(); // 自定义中间件:把Authorizer的context转成请求头 app.Use(async (context, next) => { // 从服务容器中取出Lambda的请求对象 if (context.RequestServices.GetService(typeof(APIGatewayProxyRequest)) is APIGatewayProxyRequest lambdaRequest) { var authorizerContext = lambdaRequest.RequestContext.Authorizer; if (authorizerContext != null) { // 给请求头加个前缀(比如X-Authorizer-),避免和其他头冲突 foreach (var kvp in authorizerContext) { context.Request.Headers.Append($"X-Authorizer-{kvp.Key}", kvp.Value?.ToString() ?? string.Empty); } } } await next(); }); // 接口里直接通过请求头获取 app.MapGet("/your-endpoint", (HttpContext context) => { var companyId = context.Request.Headers["X-Authorizer-company_id"].ToString(); var owner = context.Request.Headers["X-Authorizer-Owner"].ToString(); return Results.Ok(new { CompanyId = companyId, RequestedBy = owner }); }); app.Run();
三、必查的配置要点
- 确认API Gateway的目标方法已经关联了你的Lambda Authorizer,并且在集成设置里选了Lambda代理集成(控制台里方法的“集成请求”页面能验证)。
- Lambda Authorizer返回的
context键名尽量用小写字母加下划线,避免特殊字符,减少解析问题。 - 一定要用示例里的
DefaultLambdaJsonSerializer序列化器,不然可能出现Authorizer字段读不到的情况。
内容的提问来源于stack exchange,提问作者Nirmal
相关产品推荐
相关产品推荐

