使用Amazon.Lambda.AspNetCoreServer自定义授权者数据

时间:2017-04-04 10:51:12

标签: c# amazon-web-services asp.net-core aws-lambda

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

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

使用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键不包含任何数据。

几种解决方案被抛出:

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

有没有办法干净利落地实现这一目标?

1 个答案:

答案 0 :(得分:1)

我们处于完全相同的情况,我无法提供一个干净整洁的解决方案,但我有一个解决方法。

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

{
    [...]
    "requestContext": {
        [...]
        "authorizer": {
            "claims": {
                "claim1": "value1",
                "claim2": "value2",
                "claim3": "value3",
            }
        },
        [...]

APIGatewayProxyFunction.FunctionHandlerAsync中,他们将requestStream反序列化为APIGatewayProxyRequest。如果你进入那个班级,你会发现json的Authorizer部分被反序列化为:

public class APIGatewayCustomAuthorizerContext
{
    public string PrincipalId { get; set; }
    public string StringKey { get; set; }
    public int? NumKey { get; set; }
    public bool? BoolKey { get; set; }
}

即所有声明都在反序列化中丢失。我已在此处发布此问题:https://github.com/aws/aws-lambda-dotnet/issues/98

现在,对于解决方法,我只是放了一些"工作"一起here(代码here):

请注意,它未经测试。 : - )

用法:

public class LambdaEntryPoint : APIGatewayAuthorizerProxyFunction
{
    protected override void Init(IWebHostBuilder builder)
    {
        builder
            .UseContentRoot(Directory.GetCurrentDirectory())
            .UseStartup<Startup>()
            .UseApiGateway();
    }
}