启用安全应用程序模型框架

Microsoft 引入了一个安全且可缩放的框架,用于通过 Microsoft Entra 多重身份验证(MFA)体系结构对云解决方案提供商(CSP)合作伙伴和控制面板供应商(CPV)进行身份验证。

可以使用新模型提升合作伙伴中心 API 集成调用的安全性。 这有助于各方(包括 Microsoft、CSP 合作伙伴和 CPV)保护其基础结构和客户数据免受安全风险的影响。

CSP 计划使客户可以通过合作伙伴购买 Microsoft 产品和服务。 根据与 Microsoft 的协议,合作伙伴需要为其销售给的客户管理环境并提供支持。 通过此渠道购买的客户必须高度信任他们向其购买的合作伙伴,因为合作伙伴企业对客户租户具有高特权管理员访问权限。

作用域

本文涉及 CSP 和 CPV。

CPV

  • CPV 是独立软件供应商,其开发的应用可供 CSP 合作伙伴用来与合作伙伴中心 API 集成。
  • CPV 不是直接访问合作伙伴中心或 API 的 CSP 合作伙伴。

CSP

  • 使用“应用 ID + 用户”身份验证并直接与合作伙伴中心 API 集成的 CSP 间接提供商和 CSP 直接合作伙伴。

安全要求

有关安全要求的详细信息,请参阅合作伙伴安全要求

安全应用程序模型

商城应用程序需要模拟 CSP 合作伙伴特权才能调用 Microsoft API。 对这些敏感应用程序的安全攻击可能会导致客户数据受到损害。

有关新身份验证框架的概述和详细信息,请参阅安全应用程序模型框架,其中涵盖了使市场应用程序可持续且可靠,使其免受安全威胁的原则和最佳做法。

示例

以下概述文档和示例代码介绍了合作伙伴如何才能实现安全应用程序模型框架:

REST

若要使用示例代码通过安全应用程序模型框架进行 REST 调用,请按照以下步骤操作:

  1. 创建 Web 应用

创建 Web 应用

  1. 登录 Azure 门户

  2. 创建 Microsoft Entra 应用。

  3. 根据应用程序的要求,为委托应用程序授予对以下资源的权限。 如有必要,可以为应用程序资源添加更多委托权限。

    1. Microsoft 合作伙伴中心 (某些租户显示 SampleBECApp

    2. Azure 管理 API (如果计划调用 Azure API)

    3. Windows Azure Active Directory

  4. 确保将应用的主页 URL 设置为在其中运行实时 Web 应用的终结点。 此应用需要接受 Microsoft Entra 登录调用中的授权代码 。 例如,在以下部分的示例代码中,Web 应用在 https://localhost:44395/ 运行。

  5. 请注意 Web 应用在 Microsoft Entra ID 中的设置中的以下信息:

    • 应用程序 ID
    • 应用程序机密

注意

建议使用证书作为应用程序机密。 不过,也可在 Azure 门户中创建应用程序密钥。 以下部分中的示例代码使用应用程序密钥。

获取授权代码

必须获取 Web 应用的授权代码才能从 Microsoft Entra 登录调用接受:

  1. 登录到 Microsoft Entra ID

    请务必使用进行合作伙伴中心 API 调用的用户帐户(例如管理员代理或销售代理帐户)登录。

  2. 将 Application-Id 替换为 Microsoft Entra 应用 ID(GUID)。

  3. 出现提示时,请以配置了 MFA 的用户帐户登录。

  4. 出现提示时,输入更多 MFA 信息(电话号码或电子邮件地址)以验证登录名。

  5. 登录后,浏览器将使用授权代码将调用重定向到 Web 应用终结点。 例如,以下示例代码会将调用重定向到 https://localhost:44395/

授权代码调用跟踪

POST https://localhost:44395/ HTTP/1.1
Origin: https://login.microsoftonline.com
Upgrade-Insecure-Requests: 1
Content-Type: application/x-www-form-urlencoded
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referrer: https://login.microsoftonline.com/kmsi
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: OpenIdConnect.nonce.hOMjjrivcxzuI4YqAw4uYC%2F%2BILFk4%2FCx3kHTHP3lBvA%3D=dHVyRXdlbk9WVUZFdlFONVdiY01nNEpUc0JRR0RiYWFLTHhQYlRGNl9VeXJqNjdLTGV3cFpIWFg1YmpnWVdQUURtN0dvMkdHS2kzTm02NGdQS09veVNEbTZJMDk1TVVNYkczYmstQmlKUzFQaTBFMEdhNVJGVHlES2d3WGlCSlVlN1c2UE9sd2kzckNrVGN2RFNULWdHY2JET3RDQUxSaXRfLXZQdG00RnlUM0E1TUo1YWNKOWxvQXRwSkhRYklQbmZUV3d3eHVfNEpMUUthMFlQUFgzS01RS2NvMXYtbnV4UVJOYkl4TTN0cw%3D%3D

code=AuthorizationCodeValue&id_token=IdTokenValue&<rest of properties for state>

获取刷新令牌

然后,必须使用授权代码获取刷新令牌:

  1. 使用授权代码对 Microsoft Entra 登录终结点 https://login.microsoftonline.com/CSPTenantID/oauth2/token 进行 POST 调用。 有关示例,请参阅以下示例调用

  2. 记下返回的刷新令牌。

  3. 将刷新令牌存储在 Azure Key Vault 中。 有关详细信息,请参阅 Key Vault API 文档

重要

必须在 Key Vault 中将刷新令牌作为机密存储

刷新调用示例

占位符请求:

POST https://login.microsoftonline.com/CSPTenantID/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: login.microsoftonline.com
Content-Length: 966
Expect: 100-continue

请求正文:

resource=https%3a%2f%2fapi.partnercenter.microsoft.com&client_id=Application-Id&client_secret=Application-Secret&grant_type=authorization_code&code=AuthorizationCodeValue

占位符响应:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Content-Type: application/json; charset=utf-8

响应正文:

{"token_type":"Bearer","scope":"user_impersonation","expires_in":"3599","ext_expires_in":"3599","expires_on":"1547579127","not_before":"1547575227","resource":"https://api.partnercenter.microsoft.com","access_token":"Access

获取访问令牌

必须先获取访问令牌,然后才能调用合作伙伴中心 API。 必须使用刷新令牌来获取访问令牌,因为访问令牌通常具有有限的生存期(例如,不到一小时)。

占位符请求:

POST https://login.microsoftonline.com/CSPTenantID/oauth2/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
Host: login.microsoftonline.com
Content-Length: 1212
Expect: 100-continue

请求正文:

resource=https%3a%2f%2fapi.partnercenter.microsoft.com&client_id=Application-Id &client_secret= Application-Secret&grant_type=refresh_token&refresh_token=RefreshTokenVlaue&scope=openid

占位符响应:

HTTP/1.1 200 OK
Cache-Control: no-cache, no-store
Content-Type: application/json; charset=utf-8

响应正文:

{"token_type":"Bearer","scope":"user_impersonation","expires_in":"3600","ext_expires_in":"3600","expires_on":"1547581389","not_before":"1547577489","resource":"https://api.partnercenter.microsoft.com","access_token":"AccessTokenValue","id_token":"IDTokenValue"}

进行合作伙伴中心 API 调用

必须使用访问令牌来调用合作伙伴中心 API。 请参见以下调用示例。

合作伙伴中心 API 调用示例

GET https://api.partnercenter.microsoft.com/v1/customers/CustomerTenantId/users HTTP/1.1
Authorization: Bearer AccessTokenValue
Accept: application/json
X-Locale: en-US
Host: api.partnercenter.microsoft.com

PowerShell

合作伙伴中心 PowerShell 模块可用于管理合作伙伴中心资源。 它是由合作伙伴社区维护的开源项目,不受 Microsoft 正式支持。 如果遇到问题,可以从社区获取帮助在 GitHub 上创建问题

可以使用合作伙伴中心 PowerShell 模块,减少以授权代码交换访问令牌所需的基础结构。 进行合作伙伴中心 REST 调用时,此方法是可选的。

有关此流程的详细信息,请参阅安全应用模型 PowerShell 文档。

  1. 安装 Microsoft Entra ID 和合作伙伴中心 PowerShell 模块。

    Install-Module AzureAD
    
    Install-Module PartnerCenter
    
  2. 使用 New-PartnerAccessToken 命令执行许可过程,捕获所需的刷新令牌。

    $credential = Get-Credential
    
    $token = New-PartnerAccessToken -ApplicationId 'xxxx-xxxx-xxxx-xxxx' -Scopes 'https://api.partnercenter.microsoft.com/user_impersonation' -ServicePrincipal -Credential $credential -Tenant 'yyyy-yyyy-yyyy-yyyy' -UseAuthorizationCode
    

    注意

    ServicePrincipal 参数与 New-PartnerAccessToken 命令一起使用,因为正在使用具有 Web/API 类型的 Microsoft Entra 应用。 此类型的应用要求在访问令牌请求中包含客户端标识符和机密。 调用 Get-Credential 命令时,系统会提示你输入用户名和密码。 请输入应用程序标识符作为用户名, 输入应用程序机密作为密码。 调用 New-PartnerAccessToken 命令时,系统会提示你再次输入凭据。 请输入所用服务帐户的凭据。 此服务帐户应该是有适当权限的合作伙伴帐户。

  3. 复制刷新令牌值。

    $token.RefreshToken | clip
    

应将刷新令牌值存储在安全的存储库(如 Azure Key Vault)中。 有关如何将安全应用程序模块与 PowerShell 配合使用的详细信息,请参阅 多重身份验证 文章。