繁体   English   中英

用于 JWT 验证的 JWK 的 Azure API 管理策略缓存

[英]Azure API Management policy caching of JWKs for JWT validation

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

  1. 如何在政策中读取请求 JWT kidx5t 关于调用AsJwt() APIM 策略表达式返回Jwt对象,该对象不包含应包含必填字段的Header属性
    • 我tryed 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." while 它在​​硬编码时有效。 (我也尝试过使用Convert.ToBase64String()黑客攻击,但没有成功,对我来说似乎是 xml 验证器问题 - 可以覆盖吗?)
<issuer-signing-keys>
  <key e="@((string)context.Variables["jwkse"])" n="@((string)context.Variables["jwksn"])"/>
</issuer-signing-keys>
  1. 我可以使用x5c从我们JWKs提供商的关键值获取的值? 像这样:
<issuer-signing-keys>
  <key>@((string)context.Variables["jwksx5c"])</key>
</issuer-signing-keys>

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM