【发布时间】:2021-10-20 16:48:12
【问题描述】:
我正在尝试实现由我们的 JWT 提供商的openid-configuration/jwks 端点提供的公钥缓存。我想使用缓存值来验证传入请求的签名。我们希望有缓存以降低请求 jwks 端点。因此,我们决定创建自定义 APIM 策略来做到这一点。经过几个小时的挣扎,我发现自己一无所知。因此,我想解决一些有关 APIM xml 策略的问题。
- 如何在策略中读取请求 JWT
kid或x5t?关于APIM policy expressions 调用AsJwt()返回Jwt对象,该对象不包含应包含必填字段的Header属性- 我尝试了
Id、Claims,但没有成功到达kid或x5t(<set-variable name="requestKid" value="@(context.Request.Headers.GetValueOrDefault("Authorization","").Split(' ')[1].AsJwt()?.____)"/>)
- 我尝试了
- 从提供程序端点检索 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"])" />
- 如何设置关键指数和模数属性?当我使用上一步中的变量时,我得到了 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>
- 我可以使用从我们的 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