将 JwtAuthProviderReader 与 ServiceStack 和 AWS Cognito 结合使用
Using JwtAuthProviderReader with ServiceStack and AWS Cognito
我们正在使用 AWS Cognito 中的现有用户池,为我们的 api 服务器创建了一个单独的客户端应用程序。
使用来自 Cognito 的托管 UI 时 accessToken、idToken 和 refreshToken.
问题是将 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
});
模数和指数来自 e 和 n 在 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
否则会显示一条字符串错误消息,说明为什么无效。
我们正在使用 AWS Cognito 中的现有用户池,为我们的 api 服务器创建了一个单独的客户端应用程序。
使用来自 Cognito 的托管 UI 时 accessToken、idToken 和 refreshToken.
问题是将 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
});
模数和指数来自 e 和 n 在 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
否则会显示一条字符串错误消息,说明为什么无效。