Извлечение пользовательских объектов из HttpContext

Контекст

Я переписываю приложение 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?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
223
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел другое решение для этого.

Вместо того, чтобы пытаться изменить 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"
  }
}

Другие вопросы по теме