Igo*_*ski 5 c# amazon-web-services aws-lambda asp.net-core
在过去与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键不包含任何数据.
几种解决方案被抛出:
有没有办法干净利落地实现这一目标?
我们处于完全相同的情况,我绝对无法提供一个好的、干净的解决方案,但我有一个解决方法。
如果您查看请求负载,就会发现 json 的格式如下:
{
[...]
"requestContext": {
[...]
"authorizer": {
"claims": {
"claim1": "value1",
"claim2": "value2",
"claim3": "value3",
}
},
[...]
Run Code Online (Sandbox Code Playgroud)
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; }
}
Run Code Online (Sandbox Code Playgroud)
即所有声明都会在反序列化中丢失。我在这里发布了这个问题:https ://github.com/aws/aws-lambda-dotnet/issues/98
现在到解决方法,我只是将一些“有效”的东西放在一起(此处代码):
请注意,它还未经测试。:-)
用法:
public class LambdaEntryPoint : APIGatewayAuthorizerProxyFunction
{
protected override void Init(IWebHostBuilder builder)
{
builder
.UseContentRoot(Directory.GetCurrentDirectory())
.UseStartup<Startup>()
.UseApiGateway();
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1485 次 |
最近记录: |