市场计量服务身份验证策略

市场计量服务支持两种身份验证策略:

本文介绍何时以及如何使用不同的身份验证策略通过市场计量服务安全地提交自定义计量。

使用 Microsoft Entra 安全令牌

适用的产品/服务类型是采用托管应用程序计划类型的可交易 SaaS 和 Azure 应用程序。

使用预定义的固定Microsoft Entra 应用程序 ID 进行身份验证来提交自定义计量。

对于 SaaS 产品/服务,这是唯一可用的选项。 要发布任何 SaaS 产品/服务,则必须执行此步骤,如注册 SaaS 应用程序中所述。

对于采用托管应用程序计划的 Azure 应用程序,在以下情况下应考虑使用此策略:

  • 已有一种机制可用来与后端服务通信,并且你想要扩展此机制,以便从某个集中化服务发出自定义计量器。
  • 存在复杂的自定义计量器逻辑。 在某个集中化位置而不是在托管应用程序资源中运行此逻辑。

注册应用程序时,可以编程方式请求Microsoft Entra 安全令牌。 发布者预期使用此令牌,并发出请求来解析它。

有关这些令牌的详细信息,请参阅 Microsoft Entra 访问令牌

基于 Microsoft Entra 应用获取令牌

HTTP 方法

POST

请求 URL

https://login.microsoftonline.com/*{tenantId}*/oauth2/token

URI 参数

参数名称 必需 描述
tenantId True 已注册Microsoft Entra 应用程序的租户 ID。

请求标头

标头名称 必需 描述
Content-Type True 与请求关联的内容类型。 默认值为 application/x-www-form-urlencoded

请求正文

属性名称 必需 描述
Grant_type True 授权类型。 使用 client_credentials
Client_id True 与 Microsoft Entra 应用关联的客户端/应用标识符。
client_secret True 与 Microsoft Entra 应用关联的机密。
Resource True 为其请求令牌的目标资源。 使用 20e940b3-4c77-4b0b-9a53-9e16a1b010a7

响应

Name 类型 描述
200 OK TokenResponse 请求成功。

TokenResponse

示例响应令牌:

  {
      "token_type": "Bearer",
      "expires_in": "3600",
      "ext_expires_in": "0",
      "expires_on": "15251…",
      "not_before": "15251…",
      "resource": "20e940b3-4c77-4b0b-9a53-9e16a1b010a7",
      "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImlCakwxUmNxemhpeTRmcHhJeGRacW9oTTJZayIsImtpZCI6ImlCakwxUmNxemhpeTRmcHhJeGRacW9oTTJZayJ9…"
  }

使用 Azure 托管标识令牌

适用的产品/服务类型是 Kubernetes 应用产品/服务和具有托管应用程序计划类型的 Azure 应用程序。

使用此方法,部署的资源标识可以进行身份验证以发送自定义计量使用情况事件。 可以在部署边界内嵌入用于发出使用情况的代码。

注意

发布者应确保发出使用情况的资源被锁定,以免使用情况数据遭到篡改。

托管应用程序可以包含从虚拟机到 Azure Functions 在内的各种类型的资源。 有关如何使用各种服务的托管标识进行身份验证的详细信息,请参阅如何使用 Azure 资源的托管标识)。

例如,使用以下步骤通过 Windows VM 进行身份验证,

  1. 确保使用以下方法之一来配置托管标识:

  2. 使用系统标识、通过 RDP 连接到 VM、打开 PowerShell 控制台并运行以下命令,获取市场计量服务应用程序 ID(20e940b3-4c77-4b0b-9a53-9e16a1b010a7)的访问令牌:

    # curl is an alias to Web-Invoke PowerShell command
    # Get system identity access tokenn
    $MetadataUrl = "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fmanagement.azure.com%2F"
    $Token = curl -H @{"Metadata" = "true"} $MetadataUrl | Select-Object -Expand Content | ConvertFrom-Json
    $Headers = @{}
    $Headers.Add("Authorization","$($Token.token_type) "+ " " + "$($Token.access_token)")
    
  3. 从当前资源组“ManagedBy”属性(Kubernetes 应用产品/服务不需要)获取托管应用 ID。

    # Get subscription and resource group
    $metadata = curl -H @{'Metadata'='true'} http://169.254.169.254/metadata/instance?api-version=2019-06-01 | select -ExpandProperty Content | ConvertFrom-Json 
    
    # Make sure the system identity has at least reader permission on the resource group
    $managementUrl = "https://management.azure.com/subscriptions/" + $metadata.compute.subscriptionId + "/resourceGroups/" + $metadata.compute.resourceGroupName + "?api-version=2019-10-01"
    $resourceGroupInfo = curl -Headers $Headers $managementUrl | select -ExpandProperty Content | ConvertFrom-Json
    $managedappId = $resourceGroupInfo.managedBy 
    
  4. 使用市场计量服务 API 发出使用情况。

对于 Kubernetes 应用产品/服务,请使用以下步骤从应用获取身份验证令牌。 有关详细信息,请参阅 示例代码

  1. 应用程序的托管服务标识(MSI)客户端 ID 需要用于生成身份验证令牌,以便与Microsoft市场计量 API 通信。 有关详细信息,请参阅 示例代码

    # Audience for the token to be generated 
    resource = '20e940b3-4c77-4b0b-9a53-9e16a1b010a7'
    clientId = <identity client id>
    url = "http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&clientId={0}&resource={1}".format(clientId,resource)
    headers = {'Metadata': 'true'}
    # Need to import requests module 
    response = requests.get(url)
    response = requests.get(url, headers=headers)
    authToken = response.json()
    
  2. 使用市场计量服务 API 发出使用情况