"JWT Validation Failed: JWT not present.." 在 Azure API 管理服务中
"JWT Validation Failed: JWT not present.." in Azure API Management Service
作为参考,我正在尝试重现此处讨论的解决方案: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.."
}
我进行了一些谷歌搜索并尝试了以下解决方案:
和
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. 您在浏览器中请求 url 时提到了错误 { "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
权限后,还需要点击“Grant admin consent for xxx”。
然后单击“证书和机密”选项卡,单击“新建客户端机密”以生成客户端机密。复制这个秘密,因为它只会显示一次。
4).然后你需要获取access token,请参考下面的截图来请求access token。
在上面的屏幕截图中,您需要将主机 url 中的 <tenant id>
替换为您的租户 ID。并且您还需要输入前三个参数。最后一个参数 grant_type
是静态的。
5).请求访问令牌,您将得到如下屏幕截图所示的响应。
复制 access_token
的值并将其粘贴到此 page 以解码令牌,您可以在其中看到具有 Writer
权限的声明 roles
。您需要在 APIM 中的 <validate-jwt>
政策中检查此声明。
6).转到您的 apim 并单击 validate-jwt
策略的 pencil
图标。
7).像下面的截图一样编辑“Reauired claims”:
8).之后就可以测试api in APIM服务了。添加一个 header 键:Authorization
,值:Bearer <your access token>
(注意 Bearer
和访问令牌之间有一个空格)。
作为参考,我正在尝试重现此处讨论的解决方案: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.."
}
我进行了一些谷歌搜索并尝试了以下解决方案:
这是来自 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. 您在浏览器中请求 url 时提到了错误 { "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
权限后,还需要点击“Grant admin consent for xxx”。
然后单击“证书和机密”选项卡,单击“新建客户端机密”以生成客户端机密。复制这个秘密,因为它只会显示一次。
4).然后你需要获取access token,请参考下面的截图来请求access token。
<tenant id>
替换为您的租户 ID。并且您还需要输入前三个参数。最后一个参数 grant_type
是静态的。
5).请求访问令牌,您将得到如下屏幕截图所示的响应。
access_token
的值并将其粘贴到此 page 以解码令牌,您可以在其中看到具有 Writer
权限的声明 roles
。您需要在 APIM 中的 <validate-jwt>
政策中检查此声明。
6).转到您的 apim 并单击 validate-jwt
策略的 pencil
图标。
7).像下面的截图一样编辑“Reauired claims”:
8).之后就可以测试api in APIM服务了。添加一个 header 键:Authorization
,值:Bearer <your access token>
(注意 Bearer
和访问令牌之间有一个空格)。