启用安全应用程序模型框架
Microsoft 引入了一个安全且可缩放的框架,用于通过 Microsoft Azure Active Directory 多重身份验证 (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。 对这些敏感应用程序的安全攻击可能会导致客户数据受到损害。
有关新身份验证框架的概述和详细信息,请参阅安全应用程序模型框架,其中涵盖了使市场应用程序可持续且可靠,使其免受安全威胁的原则和最佳做法。
示例
以下概述文档和示例代码介绍了合作伙伴如何才能实现安全应用程序模型框架:
-
合作伙伴通常使用合作伙伴中心 Java SDK 来管理其合作伙伴中心资源。 它是由合作伙伴社区维护的开源项目。 由于此模块由合作伙伴社区维护,因此 Microsoft 不提供官方支持。 如果遇到问题,可以从社区获取帮助或在 GitHub 上创建问题。
REST
若要使用示例代码通过安全应用程序模型框架进行 REST 调用,请按照以下步骤操作:
提示
可以使用合作伙伴中心 PowerShell 模块获取授权代码和刷新令牌。 可以选择此选项来替代步骤 2 和 3。 有关详细信息,请参阅 PowerShell 部分和示例。
创建 Web 应用
在进行 REST 调用之前,必须在合作伙伴中心创建并注册 Web 应用。
登录 Azure 门户。
创建 Azure Active Directory (Azure AD) 应用。
根据应用程序的要求 ,为委托应用程序授予对以下资源的权限。 如有必要,可以为应用程序资源添加更多委托权限。
Microsoft 合作伙伴中心(某些租户将其显示为 SampleBECApp)
Azure 管理 API(如果计划调用 Azure API)
Windows Azure Active Directory
确保将应用的主页 URL 设置为在其中运行实时 Web 应用的终结点。 此应用需要接受通过调用 Azure AD 登录名获取的授权代码。 例如,在以下部分的示例代码中,Web 应用在
https://localhost:44395/运行。请注意 Azure AD 中 Web 应用的设置中的以下信息:
- 应用程序 ID
- 应用程序机密
注意
建议使用证书作为应用程序机密。 不过,也可在 Azure 门户中创建应用程序密钥。 以下部分中的示例代码使用应用程序密钥。
获取授权代码
必须通过调用 Azure AD 登录名获取需要 Web 应用接受的授权代码:
登录到 Azure AD。
请确保使用可以用来进行合作伙伴中心 API 调用的用户帐户(例如,管理代理或销售代理帐户)登录。
将 Application-Id 替换为你的 Azure AD 应用 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>
获取刷新令牌
然后,必须使用授权代码获取刷新令牌:
使用授权代码对 Azure AD 登录终结点
https://login.microsoftonline.com/CSPTenantID/oauth2/token进行 POST 调用。 有关示例,请参阅以下示例调用。记下返回的刷新令牌。
将刷新令牌存储在 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 文档。
安装 Azure AD 和合作伙伴中心 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 的 Azure AD 应用。 此类型的应用要求在访问令牌请求中包含客户端标识符和机密。 调用 Get-Credential 命令时,系统会提示你输入用户名和密码。 请输入应用程序标识符作为用户名, 输入应用程序机密作为密码。 调用 New-PartnerAccessToken 命令时,系统会提示你再次输入凭据。 请输入所用服务帐户的凭据。 此服务帐户应该是有适当权限的合作伙伴帐户。
复制刷新令牌值。
$token.RefreshToken | clip
应将刷新令牌值存储在安全的存储库(如 Azure Key Vault)中。 若要详细了解如何将安全应用程序模块与 PowerShell 配合使用,请参阅多重身份验证一文。