将 JwtAuthProviderReader 与 ServiceStack 和 AWS Cognito 结合使用

Using JwtAuthProviderReader with ServiceStack and AWS Cognito

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

使用来自 Cognito 的托管 UI 时 accessTokenidTokenrefreshToken.

问题是将 JwtAuthProviderReader 添加到 AuthFeature 以进行令牌验证时,我们得到“[=47= .1 401 Unauthorized" 对于我们使用 [Authenticate] 属性创建的任何端点。

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
});

模数和指数来自 en 在 Well-Known response ref https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxXxxXXxX/.well-known/jwks.json

始终受 Authenticate 属性保护的服务 returns HTTP/1.1 401 Unauthorized

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

我们怎么知道我们的 JwtAuthProviderReader 设置正确?

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

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

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

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

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

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

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

如果签名验证失败,这将 return null 否则它将 return 包含 JWT 正文内容的 JsonObject

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

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

如果 JWT 有效,returns null 否则会显示一条字符串错误消息,说明为什么无效。