问题描述
我在Azure中工作,我们的Web应用程序通过请求调用APIM,然后APIM调用WebApi来满足请求。
当我们尝试调用一个设置的API时,我们遇到500错误,并且当在浏览器中向下钻取错误时(下面是“错误消息”)(检查->网络),它显示了错误消息来自为API设置的validate-jwt策略(product-public.policy.xml):
<policies>
<inbound>
<base />
<validate-jwt header-name="Authorization" Failed-validation-httpcode="401" Failed-validation-error-message="Error message" require-expiration-time="true" require-scheme="Bearer" require-signed-tokens="true">
<openid-config url="{{validauthorityissuer}}/.well-kNown/openid-configuration" />
<issuer-signing-keys>
<key>Base64 Encoded Key</key>
</issuer-signing-keys>
<audiences>
<audience>{{WebAppId}}</audience>
</audiences>
<issuers>
<issuer>{{validauthorityissuer}}</issuer>
</issuers>
</validate-jwt>
</inbound>
乍一看,似乎是问题的颁发者签名密钥,因为它看起来只是一个占位符字符串。
为确认这可能是导致问题的原因,我在APIM中进行了测试,并收到以下消息: { “ code”:“ 401”, “ type”:“ AAD授权”, “ message”:“未提供访问资源的令牌。”, “ developerMessage”:“缺少或格式错误的访问令牌”, “ moreInfo”:null }
这使我更加相信问题出在发行人签名密钥上。
我的问题是,我从哪里获得发行人的签名密钥?尚未在线或通过文档找到太多帮助。
第二个问题是,假设我得到了密钥,是否必须将其转换为base64,然后将其粘贴到当前显示“ Base64 Encoded Key”的位置?
解决方法
您可以从openID端点获取发行者签名密钥。我相信您不必为此担心。如果您为APIM提供开放ID端点(如您所做的那样),APIM将自动执行此操作。下面的AD示例证实了这一点。您应该删除与发行人相关的块。我仍然会进行实验/验证。