C# 使用Amazon.Lambda.AspNetCoreServer自定义授权人数据

C# 使用Amazon.Lambda.AspNetCoreServer自定义授权人数据,c#,amazon-web-services,asp.net-core,aws-lambda,C#,Amazon Web Services,Asp.net Core,Aws Lambda,在过去广泛使用Node.js之后,我们目前正在研究ASP.NET Core作为替代Lambda平台 过去,我们的API网关前端服务依赖于自定义授权人,该授权人对用户进行身份验证,并从我们公司的IAM服务中检索基于资源的许可策略列表。授权人将该列表附加到authContext密钥。我们的服务将通过Lambda代理与API网关集成,并从原始代理请求中提取主体对象 当使用Amazon.Lambda.AspNetCoreServer在API网关和ASP.NET之间进行转换时,我们无法得出类似的场景 Am

在过去广泛使用Node.js之后,我们目前正在研究ASP.NET Core作为替代Lambda平台

过去,我们的API网关前端服务依赖于自定义授权人,该授权人对用户进行身份验证,并从我们公司的IAM服务中检索基于资源的许可策略列表。授权人将该列表附加到authContext密钥。我们的服务将通过Lambda代理与API网关集成,并从原始代理请求中提取主体对象

当使用Amazon.Lambda.AspNetCoreServer在API网关和ASP.NET之间进行转换时,我们无法得出类似的场景

Amazon.Lambda.AspNetCoreServer::ApiGatewayProxyFunction::FunctionHandlerAsync(Stream responseStream,ILambdaContext lambdaContext)或任何等效的Lambda处理程序签名将在第一个参数中接收完整的原始请求可以序列化流(例如,将其序列化为JSON.NET JObject)并从中提取主体对象

然而,在ASP.NET应用程序中访问该数据被证明是困难的。我不相信授权人响应会传递到HTTP上下文。检查时,ClaimsPrincipal context.User键不包含任何数据

提出了几种解决方案:

  • 在重写函数HandlerAsync中检索IAM信息,并使用环境变量或会话全局存储这些信息
  • 创建IAM提供程序服务的接口和补充实现。它将公开一种检索IAM信息的方法。实现将简单地返回声明的反序列化列表。该服务将在重写的Init(IWebHostBuilder)方法中配置
  • 将(声明/常规)主体对象粘在一起并尝试将其传递到HTTP上下文

有什么方法可以干净地做到这一点吗?

我们处于完全相同的情况,我绝对不能提供一个好的干净的解决方案,但我有一个解决办法

如果查看请求负载,json的格式如下:

{
    [...]
    "requestContext": {
        [...]
        "authorizer": {
            "claims": {
                "claim1": "value1",
                "claim2": "value2",
                "claim3": "value3",
            }
        },
        [...]
APIGatewayProxyFunction.FunctionHandlerAsync
中,他们将
requestStream
反序列化为
APIGatewayProxyRequest
。如果您进入该类,您会发现json的授权者部分被反序列化为:

public class APIGatewayCustomAuthorizerContext
{
    public string PrincipalId { get; set; }
    public string StringKey { get; set; }
    public int? NumKey { get; set; }
    public bool? BoolKey { get; set; }
}
也就是说,所有索赔都在反序列化过程中丢失。我已在此处发布此期:

现在谈到解决方法,我刚刚将一些“有效”的东西放在一起(代码):

请注意,这是非常未经测试的。:-)

用法:

public class LambdaEntryPoint : APIGatewayAuthorizerProxyFunction
{
    protected override void Init(IWebHostBuilder builder)
    {
        builder
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .UseApiGateway();
    }
}
公共类lambdaintrypoint:APIGatewayAuthorizerProxyFunction
{
受保护的重写void Init(IWebHostBuilder)
{
建设者
.UseContentRoot(目录.GetCurrentDirectory())
.UseStartup()
.UseApiGateway();
}
}