Azure APIM - 策略 - 无法获取有效上下文 - 错误 500 - 对象未设置为对象实例

Posted

技术标签:

【中文标题】Azure APIM - 策略 - 无法获取有效上下文 - 错误 500 - 对象未设置为对象实例【英文标题】:Azure APIM - Policy - Cannot get valid context - Error 500 - Object Not Set to Instance of Object 【发布时间】:2021-05-04 16:40:56 【问题描述】:

参考本页:https://docs.microsoft.com/en-us/azure/api-management/policies/send-request-context-info-to-backend-service

我正在尝试使用一种策略来获取 User.Group,以便我可以根据“只读”或“完全访问”组的成员身份限制对 CRUD 操作的访问。

所有 Microsoft Docs 都声明您可以通过访问 @(context.User) 以及您想要的任何属性来获取用户上下文。我提出的政策是这样的:

<policies>
    <inbound>
        <rewrite-uri template="/views/foo" />
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <choose>
            <when condition="@(context.User.Groups.Select(g => g.Name).Contains("Read-Only-Group"))">
                <return-response>
                    <set-status code="403" reason="Unauthorized" />
                    <set-body>You do not have write access - this operation is not available</set-body>
                </return-response>
            </when>
        </choose>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

我遇到的问题是,无论我尝试在策略中实施哪个基本示例,每当我尝试与用户做任何事情时,都会收到“错误 500 - 对象未设置为对象实例”。我知道这意味着我的用户对象没有被填充,但我不明白为什么。

即使我参考 Microsoft 页面上的基本示例来设置一些包含产品名称和用户 ID 的标题,它们也会失败并出现相同的错误。这些页面不包含有关访问 User 对象所需的其他步骤的任何信息。

如何访问这些项目?

【问题讨论】:

您是否制作了 API 以便需要订阅并且您还传递了订阅密钥?否则 APIM 将无法引用用户对象。 我所有的 API 都需要订阅,并且我将订阅密钥作为标头传递。使用 VScode 调试显示用户对象始终为空 【参考方案1】:

我使用https://reqbin.com/echo/get/json 作为模拟后端和这个 API 操作策略:

<policies>
    <inbound>
        <rewrite-uri template="/echo/get/json" />
        <base />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <choose>
            <when condition="@(context.User.Groups.Select(g => g.Name).Contains("Developers"))">
                <return-response>
                    <set-status code="403" reason="Unauthorized" />
                    <set-body>You do not have write access - this operation is not available</set-body>
                </return-response>
            </when>
        </choose>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

我将 API 设置为需要订阅

当使用对 API 有效的产品的订阅密钥运行操作时,我得到了正确的响应(因为默认情况下每个人都在组 Developers 中):

You do not have write access - this operation is not available

然后取消选中 subscription required 并在没有订阅密钥的情况下运行操作给我:


  "statusCode": 500,
  "message": "Internal server error",
  "activityId": "46600c4a-960a-479e-a634-8e2857cea512"

因此,当您想要访问context.User 对象时,您需要使用需要订阅的 API。

【讨论】:

谢谢凯。我试图使用内置的管理员密钥对此进行测试,看起来这就是我遇到问题的原因。使用其他帐户和密钥似乎给了我想要的结果。

以上是关于Azure APIM - 策略 - 无法获取有效上下文 - 错误 500 - 对象未设置为对象实例的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个 azure apim 策略表达式会失败?

Azure APIM 策略

Azure APIM 睡眠或延迟策略

使用 Azure APIM 策略处理表单数据

APIM:从 Azure DevOps CD 管道中的 Azure Blob 存储中检索策略 XML 失败,如收到错误,如提供的链接格式错误

需要使用 Azure APIM set-body 策略修改响应