Microsoft引入了一个安全、可缩放的框架,用于通过Microsoft Entra 多重身份验证(MFA)体系结构对云解决方案提供商(CSP)合作伙伴和控制面板供应商(CPV)进行身份验证。
可以使用新模型提升合作伙伴中心 API 集成调用的安全性。 这有助于各方(包括Microsoft、CSP 合作伙伴和 CPV)保护其基础结构和客户数据免受安全风险的影响。
CSP 计划允许客户通过合作伙伴购买Microsoft产品和服务。 根据与Microsoft的协议,合作伙伴需要管理其销售的客户的环境并提供支持。 通过此渠道购买的客户必须信任他们购买的合作伙伴,因为合作伙伴业务对客户租户拥有高特权管理员访问权限。
Scope
本文涉及 CSP 和 CPV。
CPV
- CPV 是一个独立的软件供应商,它开发供 CSP 合作伙伴使用的应用来与合作伙伴中心 API 集成。
- CPV 不是直接访问合作伙伴中心或 API 的 CSP 合作伙伴。
CSP
- 使用应用 ID + 用户身份验证并直接与合作伙伴中心 API 集成的 CSP 间接提供商和 CSP 直接合作伙伴。
安全要求
有关安全要求的详细信息,请参阅 合作伙伴安全要求。
安全应用程序模型
Microsoft市场应用程序需要模拟 CSP 合作伙伴特权来调用Microsoft API。 对这些敏感应用程序的安全攻击可能导致客户数据泄露。
有关新身份验证框架的概述和详细信息,请参阅 安全应用程序模型框架,该框架涵盖了使市场应用程序可持续且可靠免受安全威胁的原则和最佳做法。
Samples
以下概述文档和示例代码介绍了合作伙伴如何实现安全应用程序模型框架:
-
合作伙伴中心 Java SDK 可用于管理合作伙伴中心资源。 它是由合作伙伴社区维护的开源项目,不受Microsoft正式支持。 如果遇到问题,可以从 社区获取帮助 或在 GitHub 上提出问题 。
REST
若要使用示例代码通过安全应用程序模型框架进行 REST 调用,请执行以下步骤:
创建 Web 应用
登录到 Azure 门户。
创建Microsoft Entra 应用。
根据应用程序的要求,向以下资源授予委派应用程序权限。 如有必要,可以为应用程序资源添加更多委派权限。
Microsoft合作伙伴中心 (某些租户显示 SampleBECApp)
Azure 管理 API (如果计划调用 Azure API)
Windows Azure Active Directory
确保应用的主页 URL 设置为运行实时 Web 应用的终结点。 此应用需要接受来自 Microsoft Entra 登录调用的 授权代码 。 例如,在以下部分中 的示例代码 中,Web 应用在运行位置
https://localhost:44395/。请注意 web 应用设置中Microsoft Entra ID 中的以下信息:
- 应用程序 ID
- 应用程序机密
注释
建议 使用证书作为应用程序机密。 但是,还可以在 Azure 门户中创建应用程序密钥。 以下部分中的示例代码使用应用程序密钥。
获取授权代码
必须获取 Web 应用的授权代码才能从 Microsoft Entra 登录调用接受:
登录到 Microsoft Entra ID。
请务必使用进行合作伙伴中心 API 调用的用户帐户(例如管理员代理或销售代理帐户)登录。
将 Application-Id 替换为Microsoft Entra 应用 ID(GUID)。
出现提示时,请使用配置了 MFA 的用户帐户登录。
出现提示时,输入更多 MFA 信息(电话号码或电子邮件地址)以验证登录名。
登录后,浏览器将使用授权代码将调用重定向到 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>
获取刷新令牌
然后,必须使用授权代码获取刷新令牌:
使用授权代码调用 Microsoft Entra 登录终结点
https://login.microsoftonline.com/CSPTenantID/oauth2/token。 有关示例,请参阅以下示例 调用。请注意返回的刷新令牌。
将刷新令牌存储在 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":"3600","ext_expires_in":"3600","expires_on":"1547581389","not_before":"1547577489","resource":"https://api.partnercenter.microsoft.com","access_token":"AccessTokenValue","id_token":"IDTokenValue"}
获取访问令牌
必须先获取访问令牌,然后才能调用合作伙伴中心 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
验证 API 调用与 MFA 集成
为了确保使用 MFA 进行有效的 API 调用,可以在请求标头中提供 ValidateMfa。 当执行此操作时,在响应中查找 isMfaCompliant:
示例请求
GET https://api.partnercenter.microsoft.com/v1/customers/CustomerTenantId/users HTTP/1.1
...
ValidateMfa: true <-- Required header for MFA validation
...
示例响应标头
...
isMfaCompliant: true <-- Key header indicating MFA compliance
...
PowerShell
合作伙伴中心 PowerShell 模块可用于管理合作伙伴中心资源。 它是由合作伙伴社区维护的开源项目,不受Microsoft正式支持。 如果遇到问题,可以从 社区获取帮助 或在 GitHub 上提出问题 。
可以使用 合作伙伴中心 PowerShell 模块 减少所需的基础结构来交换访问令牌的授权代码。 此方法是可选的,用于进行 合作伙伴中心 REST 调用。
有关此过程的详细信息,请参阅 安全应用模型 PowerShell 文档。
安装 Microsoft Entra ID 和合作伙伴中心 PowerShell 模块。
Install-Module AzureADInstall-Module PartnerCenter使用 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 命令时,系统会提示你再次输入凭据。 输入所使用的服务帐户的凭据。 此服务帐户应是具有适当权限的合作伙伴帐户。
复制刷新令牌值。
$token.RefreshToken | clip
应在安全存储库(例如 Azure Key Vault)中存储刷新令牌值。 有关如何将安全应用程序模块与 PowerShell 配合使用的详细信息,请参阅 多重身份验证 文章。