Azure APIM - 策略 - 无法获取有效上下文 - 错误 500 - Object 未设置为 Object 的实例
Azure APIM - Policy - Cannot get valid context - Error 500 - Object Not Set to Instance of Object
我正在尝试使用策略获取 User.Group,以便我可以根据 'read-only' 或 'full-access' 组的成员身份限制对 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>
我遇到的问题是,无论我尝试在策略中实施哪个基本示例,每当我尝试时都会收到“错误 500 - Object 未设置为 object 的实例”与用户有任何关系。我知道这意味着我的用户 object 未填充,但我不明白为什么。
即使我参考 Microsoft 页面上的基本示例来设置一些包含产品名称和用户 ID 的 headers,它们也会失败并出现相同的错误。这些页面不包含有关访问用户所需的额外步骤的任何信息 object。
如何访问这些项目?
我使用 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
然后取消选中 需要订阅 和 运行 没有订阅密钥的操作给我:
{
"statusCode": 500,
"message": "Internal server error",
"activityId": "46600c4a-960a-479e-a634-8e2857cea512"
}
因此,当您想要访问 context.User
对象时,您需要使用需要订阅的 API。
我正在尝试使用策略获取 User.Group,以便我可以根据 'read-only' 或 'full-access' 组的成员身份限制对 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>
我遇到的问题是,无论我尝试在策略中实施哪个基本示例,每当我尝试时都会收到“错误 500 - Object 未设置为 object 的实例”与用户有任何关系。我知道这意味着我的用户 object 未填充,但我不明白为什么。
即使我参考 Microsoft 页面上的基本示例来设置一些包含产品名称和用户 ID 的 headers,它们也会失败并出现相同的错误。这些页面不包含有关访问用户所需的额外步骤的任何信息 object。
如何访问这些项目?
我使用 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
然后取消选中 需要订阅 和 运行 没有订阅密钥的操作给我:
{
"statusCode": 500,
"message": "Internal server error",
"activityId": "46600c4a-960a-479e-a634-8e2857cea512"
}
因此,当您想要访问 context.User
对象时,您需要使用需要订阅的 API。