JwtAuthProviderReader多个受众

时间:2018-03-21 02:03:33

标签: servicestack

在查看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;
    }

1 个答案:

答案 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