gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 09:01:21 30 4
gpt4 key购买 nike

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

到目前为止,我有一个非常简单的 API Controller 操作,它只是从 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();

我向应用程序添加了一个 Controller ,只是为了使用 Cognito 进行身份验证并取回访问 token 。

        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 用户名和密码时返回 token ,例如

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

因此,我将 [Authorize] 属性添加到我的 API 方法,使用 SignIn 方法获得了一个访问 token ,并在 Postman 中构造了一个请求,其中包含值为“Bearer”+ accessToken 的授权 HTTP header 。

遗憾的是,这不起作用,我想不出还有什么可以尝试的。

通过 Visual Studio 使用 Postman 请求在 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 内部服务器错误,没有其他消息。

我做错了什么?如果有任何帮助/指点,我将不胜感激。

道格

最佳答案

我不太清楚为什么,但它现在似乎工作正常!

我最终得到的代码是:

在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}"
}

当授权 HTTP header 中提供访问 token 时,对使用 [Authorize] 属性修饰的 API 方法的调用会成功,并且 User.Identity.Claims.Where(c => c.Type == "username").FirstOrDefault () 给出经过身份验证的用户的用户 ID。

感谢您的建议。

关于c# - 如何使用 AWS Cognito 保护 .Net Core Web API 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63551893/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com