Настраиваемый авторизатор AWS с использованием .NET Core - PullRequest
0 голосов
/ 03 января 2019

В AWS API Gateway я разрабатываю лямбда-функцию для пользовательского авторизатора с использованием .NET Core.API получит api-ключ в строке запроса, и мой пользовательский авторизатор проверит ключ.Насколько я понимаю, после выполнения проверки лямбда-функция должна возвращать IAM policy awslab blurprint нет примера для ядра .NET.Единственный пример, который я нашел, это GrandmasRecipes , использующий токен JWT.

Я хотел бы знать, какую политику IAM должна возвращать лямбда-функция, и есть ли соответствующие классы .NET Core для запроса и ответа?

Обновление 1
Ниже приведен мой код для специального лямбда-авторизатора.Однако я хотел бы знать:

1> Что должно быть PrincipalID.В настоящее время я просто устанавливаю его на User

2> CheckAuthorization. Метод получает все ключи из aws и проверяет существование только путем сравнения ключа из запроса.Также следует проверить Usage Plans и убедиться, что ключ из запроса настроен в Usage Plans

3> Роль, под которой выполняет этот Authorizer, привязана к политике AmazonAPIGatewayAdministrator, чтобы он мог получитьКлючи API. Какая минимальная политика требуется для этой роли для проверки API-ключа?

4> Есть ли в AWSSDK какой-либо встроенный метод для правильной проверки API-ключа?

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.Json.JsonSerializer))]
namespace ApikeyAuthorizer
{
    public class Function
    {
        public async Task<APIGatewayCustomAuthorizerResponse> FunctionHandler(APIGatewayCustomAuthorizerRequest authEvent, ILambdaContext context)
        {
            var key = authEvent.QueryStringParameters["key"];
            bool authorized = await CheckAuthorization(key);

            var authPolicy = new APIGatewayCustomAuthorizerResponse();
            authPolicy.PrincipalID = "user";
            authPolicy.PolicyDocument = new APIGatewayCustomAuthorizerPolicy();
            authPolicy.PolicyDocument.Version = "2012-10-17";
            authPolicy.PolicyDocument.Statement = new List<APIGatewayCustomAuthorizerPolicy.IAMPolicyStatement>();
            if (authorized)
            {
                var statement = new APIGatewayCustomAuthorizerPolicy.IAMPolicyStatement();
                statement.Action = new HashSet<string>(new string[] { "execute-api:Invoke" });
                statement.Effect = "Allow";
                statement.Resource = new HashSet<string>(new string[] { "arn:aws:execute-api:us-east-1:xxxxx:*/*/GET/*" });
                authPolicy.UsageIdentifierKey = key;
                authPolicy.PolicyDocument.Statement.Add(statement);
            }
            else
            {
                var statement = new APIGatewayCustomAuthorizerPolicy.IAMPolicyStatement();
                statement.Action = new HashSet<string>(new string[] { "execute-api:Invoke" });
                statement.Effect = "Deny";
                statement.Resource = new HashSet<string>(new string[] { "arn:aws:execute-api:us-east-1:xxxxx:*/*/GET/*" });
                authPolicy.PolicyDocument.Statement.Add(statement);
            }

            return authPolicy;
        }

        public async Task<bool> CheckAuthorization(string key)
        {            
            Amazon.APIGateway.AmazonAPIGatewayClient client = new Amazon.APIGateway.AmazonAPIGatewayClient();
            var response = await client.GetApiKeysAsync(new Amazon.APIGateway.Model.GetApiKeysRequest()
            {
                IncludeValues = true
            });           

            foreach (var apiKey in response.Items)
            {               
                if (apiKey.Value == key)
                {             
                    return true;
                }
            }           
            return false;
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 08 января 2019
curl -X PUT \
https://XXXX.XXXXX-api.ca-central-1.amazonaws.com/PROD/XXX-microservice \
 -H 'Content-Type: application/json' \
 -H 'x-api-key: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' \
 -d '{

 "initData": "HI",
 "name": "vaquar khan",
 "likes": "Java"
}'

Проверка ключа безопасности позаботилась об уходе API, поэтому лямбда требуется авторизатор

Пожалуйста, не создавайте дубликат вопроса, просто обновите старый квестон, я ответил на ваш вопрос здесь: - Как проверить ключ API в функции AWS Lambda

0 голосов
/ 08 января 2019

Вам не нужно использовать Lambda Authorizer для проверки API-ключа, а также его нельзя использовать для авторизации. Вы можете выполнить следующие действия, чтобы настроить проверку ключа API в API Gateway.

  1. В вашем разделе API Ресурсы установите Требуется ключ API true для методов, для которых вы хотите его включить
  2. Перейдите в раздел Ключи API , выберите Создать ключ API из Действия раскрывающийся список и создайте ключ
  3. Перейдите в раздел Планы использования и создайте новый план использования.
  4. После того, как вы создали план использования, щелкните по нему, а затем перейдите на вкладку API Keys . Здесь нажмите Добавить ключ API в план использования и добавьте ключ, созданный на шаге # 2
  5. Теперь нажмите на вкладку Подробно , затем нажмите Добавить стадию API . Выберите свой API и уровень, который вы хотите ограничить с помощью API Key.

Вашим методам API теперь требуется HTTP-заголовок x-api-key, в котором вы его включили. Когда вы запрашиваете конечную точку API, убедитесь, что вы добавили заголовок x-api-key с тем же значением, которое вы создали в шаге 2 выше. Если вы не добавите этот заголовок или введете неправильное значение, вы получите 403 Запрещенную ошибку.

...