如何解决Azure API 管理服务中的“JWT 验证失败:JWT 不存在..”
作为参考,我试图重现此处讨论的解决方案:https://www.tech-findings.com/2020/02/securing-logic-app-with-azure-active-directory.html 使用 API 管理来保护 Azure 逻辑应用程序。
我收到 JWT 错误。当我在浏览器中访问应用 url 时,它会给出:
{ "statusCode": 404,"message": "Resource not found" }
在 API 管理服务测试中,我得到:
HTTP/1.1 401 Unauthorized
跟踪它显示:
validate-jwt (-0.111 ms)
{
"message": "JWT Validation Failed: JWT not present.."
}
我做了一些谷歌搜索并尝试了以下解决方案: JWT validation failure error in azure apim 和 https://docs.microsoft.com/en-us/answers/questions/108008/azure-apim-jwt-token-validation-policy.html
这是来自 API 管理设计的入站策略:
<policies>
<inbound>
<base />
<set-method id="apim-generated-policy">POST</set-method>
<rewrite-uri id="apim-generated-policy" template="/request/paths/invoke//?api-version=2016-06-01&sp=/triggers/request/run&sv=1.0&sig={{[[LOGIC APP NAME]]_request-invoke_XXXXXXXXXXXXXXXXXXXXXXXX}}" />
<validate-jwt header-name="Authorization" Failed-validation-httpcode="401" Failed-validation-error-message="Request is not authorized or token Failed" require-expiration-time="false" require-scheme="Bearer" require-signed-tokens="true">
<openid-config url="https://login.windows.net/[[TENANT NAME]].onmicrosoft.com/.well-kNown/openid-configuration" />
<audiences>
<audience>[[THE ID OF A REGISTERED APP]]</audience>
</audiences>
</validate-jwt>
<set-header name="Authorization" exists-action="delete" />
<set-header name="apim-generated-policy" exists-action="delete" />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>
这是已注册应用的清单:
{
"id": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","acceptMappedClaims": null,"accesstokenAcceptedVersion": 2,"addIns": [],"allowPublicclient": null,"appId": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX","appRoles": [],"oauth2AllowUrlPathMatching": false,"createdDateTime": "2020-12-22T19:48:36Z","disabledByMicrosoftStatus": null,"groupMembershipClaims": null,"identifierUris": [
"api://XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
],"informationalUrls": {
"termsOfService": null,"support": null,"privacy": null,"marketing": null
},"keyCredentials": [],"kNownClientApplications": [],"logoUrl": null,"logoutUrl": null,"name": "LabsTestApp","oauth2AllowIdTokenImplicitFlow": false,"oauth2AllowImplicitFlow": false,"oauth2Permissions": [],"oauth2RequirePostResponse": false,"optionalClaims": null,"orgRestrictions": [],"parentalControlSettings": {
"countriesBlockedForMinors": [],"legalAgeGroupRule": "Allow"
},"passwordCredentials": [],"preAuthorizedApplications": [],"publisherDomain": "[[TENANT NAME]].onmicrosoft.com","replyUrlsWithType": [],"requiredResourceAccess": [],"samlMetadataUrl": null,"signInUrl": null,"signInAudience": "AzureADandPersonalMicrosoftAccount","tags": [],"tokenEncryptionKeyId": null
}
希望您能提供帮助 - 为我指明正确的方向。
解决方法
对于这个问题,你的步骤不止一个问题。
1. 您在浏览器中请求网址时提到了错误 { "statusCode": 404,"message": "Resource not found" }
。原因是当您在浏览器中请求它时,它使用 Get
方法请求,但 url 应该使用 Post
方法请求。所以它显示404 not found
。
2.当您在 API 管理服务中测试时,它显示 401 Unauthorized
。此错误的原因是您没有提供访问令牌或您提供的访问令牌无效。您提到的document中的步骤不完整,请参考以下步骤:
1)。首先,请确保您已完成您提供的文档中的所有步骤。
2)。然后进入你在azure ad中注册的app,点击“Manifest”标签,在“Manifest”的json中添加一个appRole。
您可以为此角色指定一个名称(您想要的任何名称),我将角色命名为 Writer
,如上面的屏幕截图所示。您还可以指定一个“id”(以 GUID 格式)作为 appRole 中 id
字段的值。有关添加 appRole 的更多详细信息,您可以参考此document。
3)。您需要在 azure ad 中将另一个应用注册为客户端应用。执行与您的文档所示相同的注册操作以注册另一个应用程序,我注册了该应用程序并命名为 huryGetToken4
。转到此应用并单击“API 权限”选项卡,单击“添加权限”并找到您注册的原始应用,然后添加权限 Writer
。
添加 Writer
权限后,您还需要点击“授予 xxx 管理员同意”。
然后单击“证书和机密”选项卡,单击“新建客户端机密”以生成客户端机密。复制这个秘密,因为它只会显示一次。
4)。然后您需要获取访问令牌,请参考下面的屏幕截图来请求访问令牌。
在上面的屏幕截图中,您需要将 <tenant id>
替换为主机 url 中的租户 ID。并且您还需要输入前三个参数。最后一个参数 grant_type
是静态的。
5)。请求访问令牌,您将得到如下图所示的响应。
复制 access_token
的值并将其粘贴到此 page 以解码令牌,您可以看到声明 roles
中具有 Writer
权限。您需要在 APIM 中的 <validate-jwt>
政策中检查此声明。
6)。转到您的 apim 并单击 pencil
策略的 validate-jwt
图标。
7)。像下面的截图一样编辑“Reauired claim”:
8)。之后,您可以在 APIM 服务中测试 api。添加带有键:Authorization
,值:Bearer <your access token>
的标头(注意 Bearer
和访问令牌之间有一个空格)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。