【问题标题】:AWS Cognito JWT will not pass validation with .net core api, missing cognito configuration?AWS Cognito JWT 不会通过 .net core api 的验证,缺少 cognito 配置?
【发布时间】: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


    【解决方案1】:

    事实证明,就 Cognito 而言,我确实做的一切都是正确的。

    我所拥有的是这个。

    app.UseRouting();
    
    app.UseAuthorization();
    app.UseAuthentication();
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
    

    这不是正确的工作顺序......这是......

    app.UseRouting();
    
    app.UseAuthentication(); <-- Authentication before authorization
    app.UseAuthorization();
    
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
    

    【讨论】:

      猜你喜欢
      • 2020-06-04
      • 2019-04-14
      • 2018-03-07
      • 2018-10-14
      • 2021-10-03
      • 2017-03-11
      • 2022-01-26
      • 1970-01-01
      • 2017-06-05
      相关资源
      最近更新 更多