Я переписываю приложение ASP.NET Core с запуска на лямбда-выражении для запуска в контейнере ECS. Lambda поддерживает утверждения, вводимые из Cognito Authorizer, из коробки, а Kestrel — нет.
Запросы API поступают через шлюз API, где авторизатор пула пользователей Cognito проверяет токены OAuth2 и обогащает утверждения из токена в httpContext.
Первоначально приложение работало на лямбда-выражении, где точка входа наследовала Amazon.Lambda.AspNetCoreServer.APIGatewayProxyFunction
, которая извлекала эти утверждения и добавляла их в Request.HttpContext.User.Claims
.
Kestrel, конечно, не поддерживает это, и Поставщик удостоверений AWS ASPNET Cognito, похоже, предназначен для выполнения тех же действий, что и авторизатор.
Поэтому у меня возникла идея, что, возможно, я могу добавить какой-нибудь собственный код для его извлечения. HTTP-запрос, внедренный в лямбда, выглядит так, поэтому я ожидаю, что он должен быть таким же, когда он проксируется в ECS.
{
"resource": "/{proxy+}",
"path": "/api/authtest",
"httpMethod": "GET",
"headers": {
<...>
},
"queryStringParameters": null,
"pathParameters": {
"proxy": "api/authtest"
},
"requestContext": {
"resourceId": "8gffya",
"authorizer": {
"cognito:groups": "Admin",
"phone_number_verified": "true",
"cognito:username": "normj",
"aud": "3mushfc8sgm8uoacvif5vhkt49",
"event_id": "75760f58-f984-11e7-8d4a-2389efc50d68",
"token_use": "id",
"auth_time": "1515973296",
"you_are_special": "true"
}
<...>
}
Возможно ли и как я могу добавить все пары ключ/значение от requestContext.authorizer
до Request.HttpContext.User.Claims
?
Я нашел другое решение для этого.
Вместо того, чтобы пытаться изменить HttpContext
, я сопоставляю выходные данные авторизатора с заголовками запросов в интеграции шлюза API. Недостатком этого является то, что каждое утверждение должно быть жестко закодировано, поскольку кажется невозможным перебирать их.
Пример терраформирования
resource "aws_api_gateway_integration" "integration" {
rest_api_id = "${var.aws_apigateway-id}"
resource_id = "${aws_api_gateway_resource.proxyresource.id}"
http_method = "${aws_api_gateway_method.method.http_method}"
integration_http_method = "ANY"
type = "HTTP_PROXY"
uri = "http://${aws_lb.nlb.dns_name}/{proxy}"
connection_type = "VPC_LINK"
connection_id = "${aws_api_gateway_vpc_link.is_vpc_link.id}"
request_parameters = {
"integration.request.path.proxy" = "method.request.path.proxy"
"integration.request.header.Authorizer-ResourceId" = "context.authorizer.resourceId"
"integration.request.header.Authorizer-ResourceName" = "context.authorizer.resourceName"
"integration.request.header.Authorizer-Scopes" = "context.authorizer.scopes"
"integration.request.header.Authorizer-TokenType" = "context.authorizer.tokenType"
}
}