【问题标题】:Azure API Management policy caching of JWKs for JWT validation用于 JWT 验证的 JWK 的 Azure API 管理策略缓存
【发布时间】:2021-10-20 16:48:12
【问题描述】:

我正在尝试实现由我们的 JWT 提供商的openid-configuration/jwks 端点提供的公钥缓存。我想使用缓存值来验证传入请求的签名。我们希望有缓存以降低请求 jwks 端点。因此,我们决定创建自定义 APIM 策略来做到这一点。经过几个小时的挣扎,我发现自己一无所知。因此,我想解决一些有关 APIM xml 策略的问题。

  1. 如何在策略中读取请求 JWT kidx5t?关于APIM policy expressions 调用AsJwt() 返回Jwt 对象,该对象不包含应包含必填字段的Header 属性
    • 我尝试了IdClaims,但没有成功到达kidx5t (<set-variable name="requestKid" value="@(context.Request.Headers.GetValueOrDefault("Authorization","").Split(' ')[1].AsJwt()?.____)"/>)
  2. 从提供程序端点检索 JWK 时,我无法将各种响应字段存储到单独的上下文变量中,它总是在第二个 <set-variable 上失败。似乎(IResponse)context.Variables["jwksResponse"]) 在第二次调用时为空。上下文变量在第一次读取后会被销毁吗?
<send-request mode="new" response-variable-name="jwksResponse" timeout="10" ignore-error="true">
  <set-url>https://some.identity.server/.well-known/openid-configuration/jwks</set-url>
  <set-method>GET</set-method>
</send-request>
<set-variable name="jwksn" value="@(((IResponse)context.Variables["jwksResponse"]).Body.As<JObject>()["keys"][0]["n"])" />
<set-variable name="jwkse" value="@(((IResponse)context.Variables["jwksResponse"]).Body.As<JObject>()["keys"][0]["e"])" />
  1. 如何设置关键指数和模数属性?当我使用上一步中的变量时,我得到了 xml 验证错误:"ValidationError" - "Error in element 'validate-jwt' on line 8, column 4: value is not a valid base64url string.",而它在硬编码时有效。 (我还尝试使用 Convert.ToBase64String() 进行黑客攻击,但没有成功,对我来说似乎是 xml 验证器问题 - 它可以被覆盖吗?)
<issuer-signing-keys>
  <key e="@((string)context.Variables["jwkse"])" n="@((string)context.Variables["jwksn"])"/>
</issuer-signing-keys>
  1. 我可以使用从我们的 JWK 提供程序检索到的 x5c 值作为键值吗?像这样:
<issuer-signing-keys>
  <key>@((string)context.Variables["jwksx5c"])</key>
</issuer-signing-keys>

【问题讨论】:

  • 您不能在 validate-jwt 策略中使用 OpenID 支持的任何特殊原因?它将在内部缓存 JWK。
  • @VitaliyKurokhtin OpenId 的缓存是什么样的?是否有一些关于在 apim 策略上缓存 jwks 键的文档?我没有找到任何关于此的信息。

标签: azure validation jwt azure-api-management azure-policy


【解决方案1】:

经过进一步调查,我们发现gitHub 线程在使用 OpenId 进行 JWT 验证时缓存 JWK。似乎 JKW 被缓存了 1 小时,并且在验证失败时也会重新缓存。但是,文档中并未说明此行为。

【讨论】:

    猜你喜欢
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 2020-10-29
    相关资源
    最近更新 更多