在查看JwtAuthProviderReader类时,我注意到Audience属性中配置的受众必须与JWT中的aud值完全匹配。这有什么特别的原因吗?我的aud值有多个值(客户端能够访问多个离散微服务),并且如果受众包含在该列表中,则更喜欢服务器端。
来自Auth0文档(https://auth0.com/docs/tokens/id-token)
观众。单个区分大小写的字符串或URI或此类值的数组,用于唯一标识此JWT的预期收件人。对于Auth0颁发的ID令牌,这将是您的Auth0客户端的客户端ID。
ServiceStack来源(https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack/Auth/JwtAuthProviderReader.cs)
public string GetInvalidJwtPayloadError(JsonObject jwtPayload)
{
if (jwtPayload == null)
throw new ArgumentNullException(nameof(jwtPayload));
var expiresAt = GetUnixTime(jwtPayload, "exp");
var secondsSinceEpoch = DateTime.UtcNow.ToUnixTime();
if (secondsSinceEpoch >= expiresAt)
return ErrorMessages.TokenExpired;
if (InvalidateTokensIssuedBefore != null)
{
var issuedAt = GetUnixTime(jwtPayload, "iat");
if (issuedAt == null || issuedAt < InvalidateTokensIssuedBefore.Value.ToUnixTime())
return ErrorMessages.TokenInvalidated;
}
if (jwtPayload.TryGetValue("aud", out var audience))
{
if (audience != Audience)
return "Invalid Audience: " + audience;
}
return null;
}
答案 0 :(得分:0)
为简单起见,仅支持对单个受众进行配置,嵌入和验证。但我在this commit中添加了对多个受众群体的支持。
您现在可以在哪里配置具有多个受众的JWT提供商,例如:
new JwtAuthProvider {
Audiences = { "foo", "bar" }
}
它们都将作为数组嵌入到JWT中,如果只有1个受众,它将继续作为字符串嵌入。
在验证具有多个受众的JWT时,只需匹配使用JwtAuthProvider配置的单个受众,例如,给定以上配置:
JWT[aud] = null //= Valid: No Audience specified
JWT[aud] = qux //= NOT Valid: Wrong Audience specified
JWT[aud] = [bar,qux] //= Valid: Partial Audience match
此功能现在可从v5.0.3获得,现在为available on MyGet。