如何使用AWS Cognito保护.Net Core Web API应用程序

问题描述

我是AWS的新手,需要使用Cognito保护对.NET Core Web API应用程序的访问。我主要关注的是Les Jackson(https://www.youtube.com/watch?v=3PyUjOmuFic)在YouTube上播放的精彩视频,但是他使用Azure而不是AWS。

到目前为止,我有一个非常简单的API控制器操作,该操作仅从sql Server中提取一些记录并发送JSON响应。

        [HttpGet]
        public async Task<IEnumerable<TodoItem>> Get()
        {
            var items = await context.TodoItem.ToListAsync();
            return items;
        }

这在Visual Studio中本地运行良好,也可以在使用Elastic Beanstalk部署到AWS实例时使用。

为了保护应用程序的安全性,我在Startup.cs中添加了ConfigureServices方法

    services.AddAuthentication("Bearer")
        .AddJwtBearer(options =>
        {
            options.Audience = "App client id";
            options.Authority = "https://cognito-idp.eu-west-2.amazonaws.com/Cognito User Pool id";
        });

然后在Configure方法

            app.UseAuthentication();

我在应用程序中添加一个控制器,以通过Cognito进行身份验证并获取访问令牌。

        private const string _clientId = "App client id";
        private readonly RegionEndpoint _region = RegionEndpoint.EUWest2;

        [HttpPost]
        [Route("/api/signin")]
        public async Task<ActionResult<string>> SignIn(User user)
        {
            var cognito = new AmazonCognitoIdentityProviderClient(_region);

            var request = new AdminInitiateAuthRequest
            {
                UserPoolId = "Cognito User Pool id",ClientId = _clientId,AuthFlow = AuthFlowType.ADMIN_USER_PASSWORD_AUTH
            };

            request.AuthParameters.Add("USERNAME",user.Username);
            request.AuthParameters.Add("PASSWORD",user.Password);

            var response = await cognito.AdminInitiateAuthAsync(request);

            return Ok(response.AuthenticationResult);
        }

经过一番混乱后,我已经在本地和AWS上工作了,例如,使用Postman张贴Cognito用户名密码时,会返回令牌。

{
    "accesstoken": ".....","expiresIn": 3600,"idToken": "...","newDeviceMetadata": null,"refreshToken": "...","tokenType": "Bearer"
}

因此,我将[Authorize]属性添加到我的API方法中,使用SignIn方法获得了访问令牌,并在Postman中构造了一个请求,该请求包括带有值“ Bearer” + accesstoken的Authorization HTTP标头。

可悲的是,这无法正常工作,我想不出要尝试的其他方式。

使用Postman请求通过Visual Studio在IIS Express中本地运行的应用程序时,我得到了响应

system.invalidOperationException: IDX20803: Unable to obtain configuration from: '[PII is hidden. For more details,see https://aka.ms/IdentityModel/PII.]'.
 ---> System.IO.IOException: IDX20807: Unable to retrieve document from: '[PII is hidden. For more details,see https://aka.ms/IdentityModel/PII.]'. HttpResponseMessage: '[PII is hidden. For more details,see https://aka.ms/IdentityModel/PII.]',HttpResponseMessage.Content: '[PII is hidden. For more details,see https://aka.ms/IdentityModel/PII.]'.

使用Elastic Beanstalk部署应用程序时,我只收到500 Internal Server Error,没有其他消息。

我在做什么错?我将不胜感激任何帮助/指针。

道格

解决方法

我不太清楚为什么,但是现在看来一切正常!

我最终得到的最终代码是:

在ConfigureServices中,Startup.cs

            services.AddAuthentication("Bearer")
                .AddJwtBearer(options =>
                {
                    options.TokenValidationParameters = new TokenValidationParameters { ValidateAudience = false };
                    options.Authority = "https://cognito-idp.eu-west-2.amazonaws.com/eu-west-2_xxxxxxxxx";
                    options.RequireHttpsMetadata = false;
                });

在“配置”中,Startup.cs

            app.UseAuthentication();

在appsettings.json

  "AWSCognito": {
    "Region": "{Region}","PoolId": "{PoolId}","AppClientId": "{AppClientId}"
  }

在Authorization HTTP标头中提供访问令牌时,将成功调用用[Authorize]属性修饰的API方法,并调用User.Identity.Claims.Where(c => c.Type ==“ username”)。FirstOrDefault ()给出已验证用户的用户ID。

感谢您的建议。