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

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

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

使用 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 为其请求令牌的目标资源。 使用 00001111-aaaa-2222-bbbb-3333cccc4444

响应

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

令牌响应

示例响应令牌:

  {
      "token_type": "Bearer",
      "expires_in": "3600",
      "ext_expires_in": "0",
      "expires_on": "15251…",
      "not_before": "15251…",
      "resource": "00001111-aaaa-2222-bbbb-3333cccc4444",
      "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6ImlCakwxUmNxemhpeTRmcHhJeGRacW9oTTJZayIsImtpZCI6ImlCakwxUmNxemhpeTRmcHhJeGRacW9oTTJZayJ9…"
  }

使用 Azure 托管标识令牌

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

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

注意

发布服务器应确保发出使用情况的资源被锁定,因此不会被篡改。

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

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

  1. 确保使用以下方法之一配置托管身份:

  2. 使用系统身份获取市场计量服务应用程序 ID (00001111-aaaa-2222-bbbb-3333cccc4444) 的访问令牌,然后通过 RDP 连接到 VM,打开 PowerShell 控制台并运行命令:

    # 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”属性获取托管应用 ID(Kubernetes 应用产品/服务不需要)。

    # 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 = '00001111-aaaa-2222-bbbb-3333cccc4444'
    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 发出使用情况