Извлечение идентификатора из ответа лямбда-авторизатора

#asp.net-core #asp.net-identity #amazon-cognito #aws-sdk-net #lambda-authorizer

#asp.net-ядро #asp.net-идентификатор #amazon-cognito #aws-sdk-net #лямбда-авторизатор

Вопрос:

Я создал пользовательский лямбда-авторизатор, который проверяет JWT и возвращает Allow политику.

  var context = new APIGatewayCustomAuthorizerContextOutput();

 var tokenUse = ExtractClaims(claims, "token_use");
 context["tokenType"] = tokenUse;
 var response = new APIGatewayCustomAuthorizerResponse
 {
     PrincipalID = "asd",
     PolicyDocument = new APIGatewayCustomAuthorizerPolicy
     {
         Version = "2012-10-17",
         Statement = new List<APIGatewayCustomAuthorizerPolicy.IAMPolicyStatement>()
         {
             new APIGatewayCustomAuthorizerPolicy.IAMPolicyStatement
             {
                 Action = new HashSet<string>() {"execute-api:Invoke"},
                 Effect = "Allow",
                 Resource = new HashSet<string>() {"***"} // resource arn here
              }
          },
      },
      Context = context
 };

 return response;
  

Теперь мне нужно использовать этот идентификатор на моем сервере ресурсов.

Проблема в том, что утверждения, которые я помещаю в контекст authorizer, отображаются под authorizer напрямую

  "authorizer": {
            "cognito:groups": "Admin", ...
 }
  

но мой Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction ожидает тех, кто находится под authorizer.claims .

например, такое:

  "authorizer": {
            "claims": {
                "cognito:groups": "Admin", ... 
             }
  }
  

И я знаю это, потому что это работало, когда я использовал встроенный в Cognito User Pool authorizer authorizer, который делал ввод таким образом.

Мне удалось обнаружить, что Lambda Authorizer не разрешено добавлять вложенные объекты в контекст (и проверил, что он выдает, authorizer error если я это сделаю.)

Я также обнаружил, что когда APIGatewayProxyFunction извлекается идентификатор, он смотрит на Authorizer.Утверждения.

Поэтому мне нужно либо извлечь их на моем сервере ресурсов, каким-то образом минуя Claims свойство, либо добавить вложенный объект в ответ authorizer, что недопустимо.

Что делать?

Ответ №1:

Итак, я решил это, переопределив PostCreateContext метод в моем LambdaEntryPoint : Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction .

 protected override void PostCreateContext(
        HostingApplication.Context context,
        APIGatewayProxyRequest apiGatewayRequest, ILambdaContext lambdaContext)
{
        // handling output from cognito user pool authorizer
        if (apiGatewayRequest?.RequestContext?.Authorizer?.Claims != null)
        {
            var identity = new ClaimsIdentity(apiGatewayRequest.RequestContext.Authorizer.Claims.Select(
                entry => new Claim(entry.Key, entry.Value.ToString())), "AuthorizerIdentity");

            context.HttpContext.User = new ClaimsPrincipal(identity);
            return;
        }

        // handling output from lambda authorizer
        if (apiGatewayRequest?.RequestContext?.Authorizer != null)
        {
            var identity = new ClaimsIdentity(apiGatewayRequest.RequestContext.Authorizer.Select(
                entry => new Claim(entry.Key, entry.Value.ToString())), "AuthorizerIdentity");

            context.HttpContext.User = new ClaimsPrincipal(identity);
        }
    }
  

Редактировать: также отправлен запрос на извлечение в библиотеку aws-lambda-dotnet, исправляющий это.

Редактирование 2: мой запрос на извлечение был объединен в течение некоторого времени, и это больше не проблема, если используется обновленный Amazon.Lambda.AspNetCoreServer (не уверен, в какой версии он был первым, но в 3.1.0 он определенно есть)