2017-04-04 18 views
5

過去,我們在Node.js上進行了廣泛的工作,目前我們正在研究將ASP.NET Core作爲替代Lambda平臺。使用Amazon.Lambda.AspNetCoreServer自定義授權者數據

過去,我們的API網關前端服務依賴於一個自定義授權者,該授權者對用戶進行了身份驗證,並從我們公司的IAM服務中檢索了基於資源的權限策略列表。授權人將該列表附加到authContext密鑰中。我們的服務將通過Lambda Proxy與API Gateway集成,並從原始代理請求中提取主體對象。

當使用Amazon.Lambda.AspNetCoreServer在API網關和ASP.NET之間進行轉換時,我們無法得出類似的情況。

Amazon.Lambda.AspNetCoreServer :: ApiGatewayProxyFunction :: FunctionHandlerAsync(流responseStream,ILambdaContext lambdaContext),或與此有關的任何等效LAMBDA處理程序簽名,接收第一參數的完整,原始請求。 這是可能的序列化流(例如,到JSON.NET JObject)並提取主體對象。

但是,證明困難的是訪問ASP.NET應用程序內的數據。我不相信授權人響應被傳遞給HTTP上下文。檢查它時,ClaimsPrincipal context.User鍵不包含任何數據。

幾種解決方案是圍繞拋出:

  • 檢索在被覆蓋的FunctionHandlerAsync IAM信息和全球存儲它們的使用環境變量或會話
  • 創建接口和互補實現的IAM提供服務。它會公開一個檢索IAM信息的方法。實施會簡單地返回反序列化的索賠列表。該服務將在重寫Init(IWebHostBuilder)方法中進行配置。
  • 粘合在一起(索賠/一般)主要對象,並試圖將它傳遞給HTTP上下文

有沒有乾淨地實現這一目標?

回答

1

我們的情況完全相同,我決不會提供一個很好的清潔解決方案,但我有一個解決方法。

如果你看一下請求負載時,JSON格式是這樣的:

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

APIGatewayProxyFunction.FunctionHandlerAsync他們反序列化requestStreamAPIGatewayProxyRequest。如果你進入那類,你會發現,JSON的認證器部分被反序列化成:

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(); 
    } 
}