问题描述
我是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";
});
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。
感谢您的建议。