Извлечение идентификационных данных из ответа лямбда-авторизатора - PullRequest
0 голосов
/ 04 марта 2019

Я сделал собственный лямбда-авторизатор, который проверяет 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 Ответ

0 голосов
/ 05 марта 2019

Итак, я решил эту проблему, переопределив метод 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, исправляя это.

...