Azure API管理JWT验证失败

Azure API管理JWT验证失败,azure,jwt,azure-api-management,Azure,Jwt,Azure Api Management,我正在尝试实现JWT验证,如中所示 为了实现这一目标,我实施了以下政策: <policies> <inbound> <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="No auth" require-expiration-time="false" require-signed-tokens="f

我正在尝试实现JWT验证,如中所示

为了实现这一目标,我实施了以下政策:

<policies>
<inbound>
    <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="No auth" require-expiration-time="false" require-signed-tokens="false">
        <issuer-signing-keys>
            <key> base64key </key>
        </issuer-signing-keys>
    </validate-jwt>
    <return-response>
        <set-status code="200" reason="OK" />
        <set-body>test</set-body>
    </return-response>
    <base />
</inbound>
<backend>
    <base />
</backend>
<outbound>
    <base />
</outbound>
<on-error>
    <base />
</on-error>
请注意,没有Ocp Apim Subscription Key标头,因为包含API的产品不需要订阅,我也用一个进行了测试。 结果是:

b'{ "statusCode": 401, "message": "No auth" }'
API请求跟踪没有提供任何有用的信息

是否有明显的遗漏?

您需要在
授权
标题值中添加“
承载人
”,即:


头文件={“授权”:“持有人eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.EYJLEHAIIXNTM0MDAZOTK4IN0.0DlazlR4-InCb-m0dBs-9BbPbyvu5s7Opr8uXIUaMdA”}

您需要在
授权
标题值中添加“
承载人
”,即:


头文件={“授权”:“持有人eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.EYJLEHAIIXNTM0MDAZOTK4IN0.0DlazlR4-InCb-m0dBs-9BbPbyvu5s7Opr8uXIUaMdA”}

因此,多亏了in的评论,我才能够找出并消除问题。 结果表明,Azure portal中的跟踪不会显示所有可用信息。 具体来说:它缺少on error条目

在查看完整的跟踪(Ocp Apim跟踪位置响应标题中提供了该位置)后,我发现了以下一点:

算法:“HS256”要求SecurityKey.KeySize大于“128”位

在提供更长的密钥后,一切都按预期进行

这就是我在测试中偷懒的原因。

因此,多亏了in的评论,我才能够找出并消除问题。 结果表明,Azure portal中的跟踪不会显示所有可用信息。 具体来说:它缺少on error条目

在查看完整的跟踪(Ocp Apim跟踪位置响应标题中提供了该位置)后,我发现了以下一点:

算法:“HS256”要求SecurityKey.KeySize大于“128”位

在提供更长的密钥后,一切都按预期进行

这就是我在测试中懒惰的原因

  • 我创建了以下策略。请注意,键值应为Base64字符串
  • 
    UGFzc3dvcmRraHNhZXJhdmJhZSdyZWp2dmFlcg==
    
  • 我创建了以下策略。请注意,键值应为Base64字符串
  • 
    UGFzc3dvcmRraHNhZXJhdmJhZSdyZWp2dmFlcg==
    
    如果您的策略与上面所示完全相同,则您的密钥中有一个前导空格和一个尾随空格:
    base64key
    @jps我刚刚在这里添加了它们。请参阅此链接:,您可能会对该问题有一些见解。如果您的策略与上面所示完全相同,您的密钥中有一个前导空格和一个尾随空格:
    base64key
    @jps我刚刚在这里添加了它们。请参阅此链接:,您可能会对这个问题有一些见解。我也尝试过,但运气不佳。如果您将引用的视频快进到21:07,您会注意到标题中没有
    承载者
    。我也尝试过,但没有成功。如果您将引用的视频快进到21:07,您会注意到标头中没有
    承载者
    。检测此情况的另一种方法是仍然发送订阅密钥和请求(开放产品不需要密钥,但仍然接受密钥),并通过ocp apim跟踪标头进行请求跟踪。那么这个错误就会出现在请求跟踪中。问题是,它没有出现在那里。在门户中,我可以看到入站、后端和出站策略的跟踪。此错误在on error policy中可见,但未显示在门户中。另一件事是,如果没有订阅密钥,您甚至无法获得跟踪。检测这种情况的另一种方法是,仍然将订阅密钥与请求一起发送(开放产品不需要密钥,但仍然接受密钥),并通过ocp apim跟踪头进行请求跟踪。那么这个错误就会出现在请求跟踪中。问题是,它没有出现在那里。在门户中,我可以看到入站、后端和出站策略的跟踪。此错误在on error policy中可见,但未显示在门户中。另一件事是,如果没有订阅密钥,您甚至无法获得跟踪。
    b'{ "statusCode": 401, "message": "No auth" }'