【问题标题】:JwtAuthProviderReader multiple audiencesJwtAuthProviderReader 多个受众
【发布时间】:2018-03-21 11:32:32
【问题描述】:

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

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    为简单起见,仅支持针对单个受众进行配置、嵌入和验证。但我刚刚在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

    【讨论】:

    • 我不认为你打算这样做,而是 IAppSettings.GetList("jwt.Audiences");要求该密钥存在于配置中,因此它在启动时抛出异常,而配置中没有该密钥。我确实在 appsettings.json 文件中使用该键的空字符串进行了测试,并且更改按预期工作。谢谢!不相关的注释我很好奇推广到官方 nuget 提要通常需要多长时间?我犹豫是否将 SS 预发布提要添加到我们的构建服务器包源中。
    • @TrentKammerer jwt.Audiences 应使用 MyGet 上的最新 v5.0.3 进行修复。我们没有下一个版本的发布日期,但不会在不久的将来发布,但预发布包与将发布到 NuGet 的包完全相同,这实际上是及时发布的快照。
    猜你喜欢
    • 2014-07-28
    • 2016-06-23
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 2018-01-07
    • 1970-01-01
    • 2019-08-12
    相关资源
    最近更新 更多