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

Azure APIM-策略-无法获取有效上下文-错误500-对象未设置为对象的实例,azure,azure-api-management,apim,Azure,Azure Api Management,Apim,关于本页: 我正在尝试使用策略获取User.Group,以便根据“只读”或“完全访问”组的成员资格限制对CRUD操作的访问 所有Microsoft文档都声明,您可以通过访问@(context.user),然后访问您想要的任何属性来获取用户上下文。我建议的政策是: <policies> <inbound> <rewrite-uri template="/views/foo" /> <base /&

关于本页:

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

所有Microsoft文档都声明,您可以通过访问@(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>

您没有写入权限-此操作不可用
我遇到的问题是,无论我尝试在策略中实现哪一个基本示例,只要我尝试与用户相关,就会得到“Error 500-Object未设置为Object的实例”。我明白这意味着我的用户对象没有被填充,但我不明白为什么

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


如何访问这些项目?

我使用了
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>
然后取消选中“需要订阅”,并在不使用订阅密钥的情况下运行该操作,我会:

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

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

您是否制作了该API以便需要订阅并传递订阅密钥?否则,APIM将无法引用用户对象。我的所有API都需要订阅,并且我正在将订阅密钥作为标头传递。使用VScode进行调试显示用户对象始终为空谢谢Kai。我试图用内置的管理员密钥来测试这个问题,看起来这就是我遇到问题的原因。使用其他帐户和密钥似乎给了我想要的结果。
{
  "statusCode": 500,
  "message": "Internal server error",
  "activityId": "46600c4a-960a-479e-a634-8e2857cea512"
}