Azure API管理REST调用为用户创建订阅(丢失)

时间:2019-01-06 16:46:03

标签: azure-api-management

我正在尝试使用here提供的示例从Azure API管理中委派产品订阅。我的原型具有有效的用户身份验证委托,但是产品订阅委托令人困惑。

在用户登录委派期间,我从APIM收到了一个对我的委派页面的请求,并根据上面的示例链接进行了处理,没有任何问题。在产品订购的委派过程中,首先会调用我的登录页面;不是委托页面。这使我想到了第一个问题:

  1. 有人可以解释为什么产品订阅的委派与用户身份验证的委派从根本上不同吗?
  2. 如果登录委托页面(按照上面引用的示例)通过检查User.Identity.IsAuthenticated来处理用户身份验证,那么为什么产品委托不能这样做,为什么将其发送到登录页面而不是委托中页面?

我已经通过使用登录页面来评估用户是否首先通过身份验证,然后将其重定向到returnUrl,如下所述:

if (User.Identity.IsAuthenticated)
{
    return LocalRedirect(returnUrl);
}

APIM提供的returnUrl的值包含以下变量:

  • 路径= /Identity/Account/Manage/Delegate
  • productId = [productId]
  • userId = [userId]
  • operation = Subscribe
  • 盐= [salt]
  • sig = [sig]

由于这些都是APIM returnUrl中提供的所有变量,因此我有以下问题:

  1. documentation about subscription using APIM REST API之后,如何确定以下必需属性:

    • subscriptionId
    • resourceGroupName
    • serviceName
    • sid
  2. 另外,对于请求正文,如何根据this reference确定properties.scope

作为测试,我在包含以下代码行的端点上调用PUT方法之前,在代码中设置了一个断点。我使用Postman通过复制VS2017中的Authorization标头和所有相关的标头/正文数据来测试创建订阅。我能够得到一个201响应,指示已创建订阅,但是该订阅未在任何地方的APIM门户中显示,并且我当然没有文档中定义的许多“必需”属性文章:

response = await client.PutAsync("/subscriptions/" + subscriptionId + "?api-version=" + apiVersion, new StringContent(ApimSubscriptionJson, Encoding.UTF8, "text/json"));

APIM PUT RESPONSE

这是我对API的测试调用的正文:

{
    "userId" : "/users/c22afea6-3e9c-4b85-87a6-2d5e97e259cf",
    "scope" : "/products/ring-0-beta-access"
}

基于这种怪异,我还有以下其他问题:

  1. 如果确实创建了该产品的订阅,那么如果不在Azure APIM门户中,该订阅会在哪里?它也不会显示在用户的个人资料中。
  2. 如果我没有为APIM REST API提供所有“必需”参数,如何在201方法上获得PUT响应?

1 个答案:

答案 0 :(得分:1)

我找到了一个解决方案,想分享。

我可以使用第9频道视频中介绍的方法。我只是在使用错误的属性。代替userId,它应该是ownerId。在订阅上运行GET后,我注意到可以看到所有内容。它们与用户没有关联,因此它们不会显示在Azure APIM门户中。

另一个重要的遗漏是通知。如果您省略了&notify=true查询字符串参数,那么当有人订阅您的API时,您不会收到通知。当您的API需要批准时,这尤其麻烦。

这似乎是潜在的产品错误,因为您不应该创建“无主”订阅。如果您不知道要看哪里,几乎就不可能找到它。