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

Я сделал собственный лямбда-авторизатор, который проверяет 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": {
            "cognito:groups": "Admin", ...
 }

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

вроде такой:

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

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

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

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

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

Что?

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, исправляя это.

Другие вопросы по тегам