"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&amp;sp=/triggers/request/run&amp;sv=1.0&amp;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 和访问令牌之间有一个空格)。