Dotnet Core Web API в AWS SAM - укажите несколько методов аутентификации - PullRequest
0 голосов
/ 20 октября 2019

Целью является создание единого проекта web api с ядром dotnet, который может поддерживать аутентификацию на основе AWS Cognito для большинства своих конечных точек и не аутентифицировать для одной конечной точки. Ниже приведен файл template.yaml.

AWSTemplateFormatVersion: '2010-09-09'
Transform: AWS::Serverless-2016-10-31
Description: An AWS Serverless Application that uses the ASP.NET Core framework running
  in Amazon Lambda.
Parameters:
  ShouldCreateBucket:
    Type: String
    AllowedValues:
    - 'true'
    - 'false'
    Description: If true then the S3 bucket that will be proxied will be created with
      the CloudFormation stack.
  BucketName:
    Type: String
    Description: Name of S3 bucket that will be proxied. If left blank a name will
      be generated.
    MinLength: '0'
  CognitoUserPoolName:
    Type: String
    Default: XXXXX-UserPool
  CognitoUserPoolClientName:
    Type: String
    Default: XXXXX-UserPool
Conditions:
  CreateS3Bucket:
    Fn::Equals:
    - Ref: ShouldCreateBucket
    - 'true'
  BucketNameGenerated:
    Fn::Equals:
    - Ref: BucketName
    - ''
Resources:
  MyCognitoAuth:
    Type: AWS::ApiGateway::Authorizer
    Properties:
      AuthorizerUri: arn:aws:cognito-idp:ap-south-1:XXXXXXXXX:userpool/ap-south-1_xxxxxxxx
      IdentitySource: method.request.header.Authorization

  MyServiceApi:
    Type: AWS::Serverless::Api
    Properties:
      Name: MyServiceApi
      StageName: !Ref Version
      Auth: 
        Authorizer: MyCognitoAuth

  AspNetCoreFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: AWSServerless1::AWSServerless1.LambdaEntryPoint::FunctionHandlerAsync
      Runtime: dotnetcore2.1
      CodeUri: Ref BucketName
      MemorySize: 256
      Timeout: 30
      Role: null
      Policies:           
      - AWSLambdaFullAccess
      Environment:
        Variables:
          AppS3Bucket:
            Fn::If:
            - CreateS3Bucket
            - Ref: Bucket
            - Ref: BucketName
      Events:
        CognitoAuthApi:
          Type: Api
          Properties:
            RestApiId: !Ref MyServiceApi
            Path: /{proxy+}
            Method: ANY
            Auth:
              Authorizer: MyCognitoAuth
        APIKeyAuthApi:
          Type: Api
          Properties:
            RestApiId: !Ref MyServiceApi
            Path: /api/users/canLogin
            Method: GET
            Auth:
              Authorizer: null
  Bucket:
    Type: AWS::S3::Bucket
    Condition: CreateS3Bucket
    Properties:
      BucketName:
        Fn::If:
        - BucketNameGenerated
        - Ref: AWS::NoValue
        - Ref: BucketName
Outputs:
  ApiURL:
    Description: API endpoint URL for Prod environment
    Value:
      Fn::Sub: https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/
  S3ProxyBucket:
    Value:
      Fn::If:
      - CreateS3Bucket
      - Ref: Bucket
      - Ref: BucketName

Но выдается следующая ошибка:

Ошибка: [InvalidResourceException ('AspNetCoreFunction', 'Событие с идентификатором [CognitoAuthApi] недопустимо.

Невозможно установить Authorizer [MyCognitoAuth] для метода API [any] для пути [/ {proxy +}], поскольку связанный API не определяет авторизаторов. '), InvalidResourceException (' MyServiceApi ', "Invalid valueдля свойства 'Auth' ')] (AspNetCoreFunction,' Событие с идентификатором [CognitoAuthApi] недопустимо.

Невозможно установить Authorizer [MyCognitoAuth] для метода API [any] для пути[/ {proxy +}], потому что связанный API не определяет авторизаторов. ') (' MyServiceApi ', "Недопустимое значение для свойства' Auth '")

Как правильно это сделать

...