1

我们在AWS Cognito中使用现有的用户池,为我们的 api 服务器创建了一个单独的客户端应用程序。

使用 Cognito 中的托管 UI 时accessTokenidTokenrefreshToken

问题是当将JwtAuthProviderReader添加到AuthFeature以进行令牌验证时,我们使用 [Authenticate] 属性创建的任何端点都会得到“ HTTP/1.1 401 Unauthorized ”。

Plugins.Add(new AuthFeature(() => new AuthUserSession(),
  new IAuthProvider[]
  {
    new JwtAuthProviderReader
    {
      Audience = "11rqr096c55xxxxxxxxxxxxxx", // App client id
      Issuer = "https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxXxxXXxX",
      HashAlgorithm = "RS256",
      PublicKey = new RSAParameters
      {
        Modulus = Base64UrlEncoder.DecodeBytes("JRDU3q2XoOcKGjcj1DsJ3Xj .... DTNVCGzUCGosKGYL0Q"),
        Exponent = Base64UrlEncoder.DecodeBytes("AQAB")
      },
      RequireSecureConnection = false,          
    }
  }
)
{ 
  IncludeAssignRoleServices = false
});

模数和指数来自众所周知的响应参考https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxXxxXXxX/.well-known/jwks.json中的en

受 Authenticate 属性保护的服务总是返回HTTP/1.1 401 Unauthorized

[Authenticate]
public object Get(GetTenants request)
{
   return ...;
} 

我们如何知道我们的JwtAuthProviderReader设置是否正确?

4

1 回答 1

1

您可以通过在已配置实例的 API 中测试 JWT Token来测试您的 JWT 是否可以使用 ServiceStack 的JWT Auth Provider进行验证,例如:IsJwtValidJwtAuthProviderReader

var jwtAuth = new JwtAuthProviderReader { ... };
jwtAuth.IsJwtValid(jwt);

false如果 JWT 无效,这将返回。JWT 无效的原因有很多,所以我要检查的第一件事是测试您是否可以通过调用实际解密 JWE 令牌GetVerifiedJwePayload(),例如:

var jsonObj = jwtAuth.GetVerifiedJwePayload(null, jwt.Split('.'));

如果成功,它将返回一个解密但未经验证的 JSON 对象。这将在您当前的配置中失败,因为解密 RSA JWE 令牌需要配置完整的PrivateKey,即不仅仅是PublicKey组件。

如果您只使用 RSA256 来验证 JWT 签名而不是加密 JWE 令牌并jwtAuth.IsJwtValid(jwt)返回false,您可以通过调用来验证签名是否有效GetVerifiedJwtPayload(),例如:

var jwtBody = jwtAuth.GetVerifiedJwtPayload(null, jwt.Split('.'));

如果签名验证失败,这将返回null,否则它将返回JsonObject带有 JWT 正文内容的 a。

然后,您可以验证 jwtBody 有效负载以检查 JWT 是否有效,例如:

var invalidErrorMessage = jwtAuth.GetInvalidJwtPayloadError(jwtBody);
var jwtIsValid = invalidErrorMessage == null;

如果 JWT 有效,则返回null,否则返回字符串错误消息为什么它不是。

于 2021-04-05T06:41:22.213 回答