Azure API 管理服务中的“JWT 验证失败:JWT 不存在..”

时间:2020-12-24 15:48:49

标签: azure api oauth-2.0 azure-api-management jwt-auth

作为参考,我试图重现此处讨论的解决方案: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 apimhttps://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 个答案:

答案 0 :(得分:2)

对于这个问题,你的步骤不止一个问题。

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。 enter image description here 您可以为此角色指定一个名称(您想要的任何名称),我将角色命名为 Writer,如上面的屏幕截图所示。您还可以指定一个“id”(以 GUID 格式)作为 appRole 中 id 字段的值。有关添加 appRole 的更多详细信息,您可以参考此document

3)。您需要在 azure ad 中将另一个应用注册为客户端应用。执行与您的文档所示相同的注册操作以注册另一个应用程序,我注册了该应用程序并命名为 huryGetToken4。转到此应用并单击“API 权限”选项卡,单击“添加权限”并找到您注册的原始应用,然后添加权限 Writerenter image description here enter image description here

添加 Writer 权限后,您还需要点击“授予 xxx 管理员同意”。 enter image description here

然后单击“证书和机密”选项卡,单击“新建客户端机密”以生成客户端机密。复制这个秘密,因为它只会显示一次。 enter image description here

4)。然后您需要获取访问令牌,请参考下面的屏幕截图来请求访问令牌。 enter image description here 在上面的屏幕截图中,您需要将 <tenant id> 替换为主机 url 中的租户 ID。并且您还需要输入前三个参数。最后一个参数 grant_type 是静态的。

5)。请求访问令牌,您将得到如下图所示的响应。 enter image description here 复制 access_token 的值并将其粘贴到此 page 以解码令牌,您可以看到声明 roles 中具有 Writer 权限。您需要在 APIM 中的 <validate-jwt> 政策中检查此声明。 enter image description here

6)。转到您的 apim 并单击 pencil 策略的 validate-jwt 图标。 enter image description here

7)。像下面的截图一样编辑“Reauired claim”: enter image description here

8)。之后,您可以在 APIM 服务中测试 api。添加带有键:Authorization,值:Bearer <your access token> 的标头(注意 Bearer 和访问令牌之间有一个空格)。 enter image description here