如何解决将 JwtAuthProviderReader 与 ServiceStack 和 AWS Cognito 结合使用
我们在 AWS Cognito 中使用现有用户池,为我们的 api 服务器创建了一个单独的客户端应用程序。
当使用来自 Cognito accessToken、idToken 和 refreshToken 的托管 UI 时。
问题是,当将 JwtAuthProviderReader 添加到 AuthFeature 以进行令牌验证时,我们会为任何端点获得“HTTP/1.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
});
模数和指数来自众所周知的响应 ref https://cognito-idp.eu-west-1.amazonaws.com/eu-west-1_xxXxxXXxX/.well-known/jwks.json
中的 e 和 n受 Authenticate 属性保护的服务总是返回 HTTP/1.1 401 Unauthorized
[Authenticate]
public object Get(GetTenants request)
{
return ...;
}
我们如何知道我们的 JwtAuthProviderReader 设置是否正确?
解决方法
您可以通过在已配置的 IsJwtValid
实例的 JwtAuthProviderReader
API 中测试 JWT 令牌来测试您的 JWT 是否可以使用 ServiceStack 的 JWT Auth Provider 进行验证,例如:
var jwtAuth = new JwtAuthProviderReader { ... };
jwtAuth.IsJwtValid(jwt);
如果 JWT 无效,这将返回 false
。 JWT 无效的原因有很多,所以我要检查的第一件事是测试您是否可以通过调用 GetVerifiedJwePayload()
来实际解密 JWE 令牌,例如:
var jsonObj = jwtAuth.GetVerifiedJwePayload(null,jwt.Split('.'));
如果成功,它将返回一个解密但未经验证的 JSON 对象。这将因您当前的配置而失败,因为解密 RSA JWE 令牌需要配置完整的 PrivateKey
,即不仅仅是 PublicKey
组件。
如果您只使用 RSA256 来验证 JWT 签名而不是加密 JWE Token 并且 jwtAuth.IsJwtValid(jwt)
返回 false
,您可以通过调用 GetVerifiedJwtPayload()
来验证签名是否有效,例如:
var jwtBody = jwtAuth.GetVerifiedJwtPayload(null,jwt.Split('.'));
如果签名验证失败,这将返回 null
,否则它将返回一个 JsonObject
,其中包含 JWT Body 的内容。
然后您可以验证 jwtBody 负载以检查 JWT 是否有效,例如:
var invalidErrorMessage = jwtAuth.GetInvalidJwtPayloadError(jwtBody);
var jwtIsValid = invalidErrorMessage == null;
如果 JWT 有效,则返回 null
,否则返回字符串错误消息,说明无效。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。