#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 он определенно есть)