【发布时间】:2021-06-11 10:40:38
【问题描述】:
我正在尝试使用 JWT 令牌将 Angular 应用程序附加到 .NET 核心 API。此时我有本地 Angular 应用程序通过 Cognito 进行身份验证并获取用户帐户。
我已经按照这个来获取附加到请求的令牌。 https://medium.com/@umashankar.itn/aws-cognito-hosted-ui-with-angular-and-asp-net-core-5ddf351680a5
Amplify.Configure({
Auth: {
region: 'us-west-2',
userPoolId: 'us-west-MY POOL',
userPoolWebClientId: 'MY APP CLIENT ID'
}
}
});
intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
if (request.url.indexOf(environment.api.baseUrl) == 0) {
return this.getToken().pipe(mergeMap(token => {
request = request.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
return next.handle(request);
}));
}
return next.handle(request);
}
}
getToken() {
return from(
new Promise((resolve, reject) => {
Auth.currentSession()
.then((session) => {
if (!session.isValid()) {
resolve(null);
} else {
resolve(session.getIdToken().getJwtToken());
}
})
.catch(err => {
return resolve(null)
});
})
);
}
我可以确认它正在将令牌添加到请求中。
值得注意的是,我使用的是session.getIdToken().getJwtToken(),但也有session.getAccessToken().getJwtToken(),它们是不同的。我找不到任何能告诉我有什么区别的东西,但我都试过了,它们都有同样的问题。
对于服务器端,我已按照此答案设置 .net 核心站点,并且我可以确认它正在从 /.well-known/jwks.json 正确下载密钥。然而,它只是不断拒绝身份验证失败的请求。
How to validate AWS Cognito JWT in .NET Core Web API using .AddJwtBearer()
services
.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.SaveToken = true;
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKeyResolver = (s, securityToken, identifier, parameters) =>
{
// get JsonWebKeySet from AWS
var json = new WebClient().DownloadString(parameters.ValidIssuer + "/.well-known/jwks.json");
// serialize the result
return JsonConvert.DeserializeObject<JsonWebKeySet>(json).Keys;
},
ValidateIssuer = true,
ValidIssuer = $"https://cognito-idp.us-west-2.amazonaws.com/us-west-MYID",
ValidateLifetime = true,
LifetimeValidator = (before, expires, token, param) => expires > DateTime.UtcNow,
ValidateAudience = true,
ValidAudience = "MY APP CLIENT ID"
};
});
app.UseAuthentication();
[HttpGet]
[Authorize]
public IEnumerable<Device> Get()
{
return 'my devices...';
}
Angular 应用在http://localhost:4200 运行,.net 核心在https://localhost:44300 运行。
所以我的问题是,我是否在我的 cognito 应用程序客户端中缺少某种设置?为了让 .NET 核心应用程序采用 JWT,我缺少什么?
【问题讨论】:
标签: amazon-web-services .net-core jwt amazon-cognito aws-amplify