В 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;
}
}
}