你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

通过 Azure Active Directory 合作伙伴集成实现安全的混合访问

Azure Active Directory (Azure AD) 支持帮助保护应用程序安全的新式身份验证协议。 但是,许多业务应用程序在受保护的企业网络中工作,而且其中一些应用程序使用旧式身份验证方法。 随着公司制定零信任策略并支持混合环境和云环境,某些解决方案会将应用连接到 Azure AD 并提供旧版应用程序的身份验证。

详细了解:适用于 Microsoft Azure Active Directory 的零信任部署指南

Azure AD 原生支持新式协议:

  • 安全断言标记语言 (SAML)
  • Web 服务联合身份验证 (WS-Fed)
  • OpenID Connect (OIDC)

Azure Active Directory 应用程序代理或 Azure AD 应用代理支持 Kerberos 和基于标头的身份验证。 不支持其他协议,例如安全外壳 (SSH)、(Microsoft Windows NT LAN Manager) NTLM、轻型目录访问协议 (LDAP) 和 Cookie。 但是,独立软件供应商 (ISV) 可以创建解决方案将这些应用程序与 Azure AD 相连接。

ISV 可以帮助客户发现服务型软件 (SaaS) 应用程序并将其迁移到 Azure AD。 他们可以将使用旧式身份验证方法的应用与 Azure AD 相连接。 客户可以合并到 Azure AD 中,以简化其应用管理并实现零信任原则。

解决方案概述

构建的解决方案可以包括以下部分:

  • 应用发现 - 客户通常不知道正在使用的每个应用程序
    • 应用程序发现可查找应用程序,促进应用与 Azure AD 集成
  • 应用迁移 - 创建工作流以将应用与 Azure AD 集成,而无需使用 Azure AD 门户
    • 集成客户当前使用的应用
  • 旧式身份验证支持 - 使用旧式身份验证方法和单一登录 (SSO) 连接应用
  • 条件访问 - 让客户无需使用 Azure AD 门户即可在解决方案中将 Azure AD 策略应用于应用

详细了解:什么是条件访问?

有关技术注意事项和建议,请参阅以下部分。

将应用程序发布到 Azure 市场

Azure 市场是面向 IT 管理员的可信应用程序来源。 应用程序与 Azure AD 兼容并支持 SSO,可以自动化用户预配,而且可以通过自动化应用注册集成到客户租户中。

可将应用程序与 Azure AD 预先集成,以支持 SSO 和自动化预配。 请参阅提交在 Azure Active Directory 应用程序库中发布应用程序的请求

建议你成为经过验证的发布者,以便客户知道你是可信的发布者。 请参阅发布者验证

为 IT 管理员启用单一登录

可通过多种方式为 IT 管理员启用到解决方案的 SSO。 请参阅计划单一登录部署(SSO 选项)

Microsoft Graph 使用 OIDC/OAuth。 客户使用 OIDC 登录到你的解决方案。 使用 JSON Web 令牌 (JWT) Azure AD 问题与 Microsoft Graph 交互。 请参阅 Microsoft 标识平台上的 OpenID Connect

如果你的解决方案使用 SAML 来实现 IT 管理员 SSO,则你的解决方案无法使用 SAML 令牌与 Microsoft Graph 交互。 可以使用 SAML 来实现 IT 管理员 SSO,但你的解决方案需要支持 OIDC 与 Azure AD 的集成,以便从 Azure AD 获取 JWT 来与 Microsoft Graph 交互。 请参阅 Microsoft 标识平台如何使用 SAML 协议

可以使用以下 SAML 方法之一:

使用客户端凭据授权类型,此类型要求你的解决方案允许客户输入客户端 ID 和密码。 该解决方案还要求你存储此信息。 从 Azure AD 获取 JWT,然后使用它来与 Microsoft Graph 交互。 请参阅获取令牌。 建议准备有关如何在其 Azure AD 租户中创建应用程序注册的客户文档。 包括终结点、URI 和权限。

注意

客户的 IT 管理员必须在其租户中同意应用程序,然后才能为应用程序启用 IT 管理员或用户 SSO。 请参阅向应用程序授予租户范围的管理员同意

身份验证流

该解决方案身份验证流支持以下方案:

  • 客户的 IT 管理员使用 SSO 进行登录来管理你的解决方案
  • 客户的 IT 管理员使用你的解决方案通过 Microsoft Graph 将应用程序与 Azure AD 集成
  • 用户登录到由你的解决方案和 Azure AD 保护的旧版应用程序

客户的 IT 管理员对你的解决方案执行单一登录

当客户的 IT 管理员登录时,你的解决方案可以使用 SAML 或 OIDC 来实现 SSO。 建议 IT 管理员使用其 Azure AD 凭据登录到你的解决方案,以便使用当前安全控制。 将解决方案与 Azure AD 集成,以通过 SAML 或 OIDC 实现 SSO。

下图描绘的是用户身份验证流:

关系图显示管理员重定向到 Azure AD 以登录,然后重定向到解决方案。

  1. IT 管理员需使用其 Azure AD 凭据登录到你的解决方案
  2. 解决方案通过 SAML 或 OIDC 登录请求将 IT 管理员重定向到 Azure AD
  3. Azure AD 对 IT 管理员进行身份验证并将其重定向到你的解决方案,以使用 SAML 令牌或 JWT 在你的解决方案中为他们授权

IT 管理员将应用程序与 Azure AD 集成

IT 管理员使用你的解决方案将应用程序与 Azure AD 集成,解决方案将使用 Microsoft Graph 来创建应用程序注册和 Azure AD 条件访问策略。

下图描绘的是用户身份验证流:

关系图显示 IT 管理员、Azure AD、你的解决方案和 Microsoft Graph 之间的交互。

  1. IT 管理员需使用其 Azure AD 凭据登录到你的解决方案
  2. 解决方案通过 SAML 或 OIDC 登录请求将 IT 管理员重定向到 Azure AD
  3. Azure AD 对 IT 管理员进行身份验证并将其重定向到你的解决方案,以使用 SAML 令牌或 JWT 进行授权
  4. 当 IT 管理员将应用程序与 Azure AD 集成时,解决方案将使用他们的 JWT 来调用 Microsoft Graph 以注册应用程序,或者应用 Azure AD 条件访问策略

用户登录到应用程序

当用户登录应用程序时,他们使用 OIDC 或 SAML。 如果应用程序需要与 Microsoft Graph 或受 Azure AD 保护的 API 交互,建议为他们配置使用 OICD。 此配置可确保应用 JWT 来与 Microsoft Graph 交互。 如果应用程序无需与 Microsoft Graph 或受 Azure AD 保护的 API 交互,请使用 SAML。

下图显示了用户身份验证流:

关系图显示了用户、Azure AD、你的解决方案和应用之间的交互。

  1. 用户登录到应用程序
  2. 解决方案通过 SAML 或 OIDC 登录请求将用户重定向到 Azure AD
  3. Azure AD 对用户进行身份验证并将其重定向到你的解决方案,以使用 SAML 令牌或 JWT 进行授权
  4. 解决方案使用应用程序协议允许请求

Microsoft Graph API

建议使用以下 API。 使用 Azure AD 配置委托的权限或应用程序权限。 对于此解决方案,请使用委托的权限。

  • 应用程序模板 API - 在 Azure 市场 中,使用此 API 查找匹配的应用程序模板
    • 所需的权限:Application.Read.All
  • 应用程序注册 API - 创建 OIDC 或 SAML 应用程序注册,以便用户登录到使用你的解决方案保护的应用程序
    • 所需的权限:Application.Read.All 和 Application.ReadWrite.All
  • 服务主体 API - 注册应用后,更新服务主体对象以设置 SSO 属性
    • 所需的权限:Application.ReadWrite.All、Directory.AccessAsUser.All 和 AppRoleAssignment.ReadWrite.All(用于分配)
  • 条件访问 API - 将 Azure AD 条件访问策略应用于用户应用程序
    • 所需的权限:Policy.Read.All、Policy.ReadWrite.ConditionalAccess 和 Application.Read.All

详细了解使用 Microsoft Graph API

Microsoft Graph API 方案

使用以下信息实现应用程序注册、连接旧版应用程序以及启用条件访问策略。 了解如何自动化管理员同意、获取令牌签名证书以及分配用户和组。

使用 Microsoft Graph API 向 Azure AD 注册应用

添加 Azure 市场中的应用

客户使用的某些应用程序位于 Azure 市场中。 可以创建一个解决方案,将应用程序添加到客户的租户。 使用 Microsoft Graph API 的以下示例在 Azure 市场中搜索模板。

注意

在应用程序模板 API 中,显示名称区分大小写。

Authorization: Required with a valid Bearer token
Method: Get

https://graph.microsoft.com/v1.0/applicationTemplates?$filter=displayname eq "Salesforce.com"

如果从 API 调用中找到匹配项,则捕获 ID。 进行以下 API 调用,并在 JSON 正文中提供应用程序的显示名称:

Authorization: Required with a valid Bearer token
Method: POST
Content-type: application/json

https://graph.microsoft.com/v1.0/applicationTemplates/cd3ed3de-93ee-400b-8b19-b61ef44a0f29/instantiate
{
    "displayname": "Salesforce.com"
}

进行 API 调用后,将生成一个服务主体对象。 捕获应用程序 ID 和服务主体 ID 以在后续的 API 调用中使用。

使用 SAML 协议和登录 URL 来修补服务主体对象:

Authorization: Required with a valid Bearer token
Method: PATCH
Content-type: servicePrincipal/json

https://graph.microsoft.com/v1.0/servicePrincipals/3161ab85-8f57-4ae0-82d3-7a1f71680b27
{
    "preferredSingleSignOnMode":"saml",
    "loginURL": "https://www.salesforce.com"
}

使用重定向 URI 和标识符 URI 修补应用程序对象:

Authorization: Required with a valid Bearer token
Method: PATCH
Content-type: application/json

https://graph.microsoft.com/v1.0/applications/54c4806b-b260-4a12-873c-967116983792
{
    "web": {
    "redirectUris":["https://www.salesforce.com"]},
    "identifierUris":["https://www.salesforce.com"]
}

添加不在 Azure 市场中的应用

如果在 Azure 市场中找不到匹配项,或者要集成自定义应用程序,请使用以下模板 ID 在 Azure AD 中注册自定义应用程序:8adf8e6e-67b2-4cf2-a259-e3dc5476c621。 然后,进行以下 API 调用,并在 JSON 正文中提供应用程序的显示名称:

Authorization: Required with a valid Bearer token
Method: POST
Content-type: application/json

https://graph.microsoft.com/v1.0/applicationTemplates/8adf8e6e-67b2-4cf2-a259-e3dc5476c621/instantiate
{
    "displayname": "Custom SAML App"
}

进行 API 调用后,将生成一个服务主体对象。 捕获应用程序 ID 和服务主体 ID 以在后续的 API 调用中使用。

使用 SAML 协议和登录 URL 来修补服务主体对象:

Authorization: Required with a valid Bearer token
Method: PATCH
Content-type: servicePrincipal/json

https://graph.microsoft.com/v1.0/servicePrincipals/3161ab85-8f57-4ae0-82d3-7a1f71680b27
{
    "preferredSingleSignOnMode":"saml",
    "loginURL": "https://www.samlapp.com"
}

使用重定向 URI 和标识符 URI 修补应用程序对象:

Authorization: Required with a valid Bearer token
Method: PATCH
Content-type: application/json

https://graph.microsoft.com/v1.0/applications/54c4806b-b260-4a12-873c-967116983792
{
    "web": {
    "redirectUris":["https://www.samlapp.com"]},
    "identifierUris":["https://www.samlapp.com"]
}

使用 Azure AD 单一登录

在 Azure AD 中注册 SaaS 应用程序后,应用程序需要开始使用 Azure AD 作为标识提供者 (IdP):

使用旧式身份验证将应用连接到 Azure AD

通过解决方案,客户可使用 SSO 和 Azure Active Directory 功能,甚至是不受支持的应用程序。 若要允许使用旧协议进行访问,应用程序会调用 Azure AD 对用户进行身份验证并应用 Azure AD 条件访问策略。 从控制台启用此集成。 在你的解决方案和 Azure AD 之间创建 SAML 或 OIDC 应用程序注册。

创建 SAML 应用程序注册

使用以下自定义应用程序模板 ID:8adf8e6e-67b2-4cf2-a259-e3dc5476c621。 然后,进行以下 API 调用,并在 JSON 正文中提供显示名称:

Authorization: Required with a valid Bearer token
Method: POST
Content-type: application/json

https://graph.microsoft.com/v1.0/applicationTemplates/8adf8e6e-67b2-4cf2-a259-e3dc5476c621/instantiate
{
    "displayname": "Custom SAML App"
}

进行 API 调用后,将生成一个服务主体对象。 捕获应用程序 ID 和服务主体 ID 以在后续的 API 调用中使用。

使用 SAML 协议和登录 URL 来修补服务主体对象:

Authorization: Required with a valid Bearer token
Method: PATCH
Content-type: servicePrincipal/json

https://graph.microsoft.com/v1.0/servicePrincipals/3161ab85-8f57-4ae0-82d3-7a1f71680b27
{
    "preferredSingleSignOnMode":"saml",
    "loginURL": "https://www.samlapp.com"
}

使用重定向 URI 和标识符 URI 修补应用程序对象:

Authorization: Required with a valid Bearer token
Method: PATCH
Content-type: application/json

https://graph.microsoft.com/v1.0/applications/54c4806b-b260-4a12-873c-967116983792
{
    "web": {
    "redirectUris":["https://www.samlapp.com"]},
    "identifierUris":["https://www.samlapp.com"]
}

创建 OIDC 应用程序注册

使用以下自定义应用程序模板 ID:8adf8e6e-67b2-4cf2-a259-e3dc5476c621。 进行以下 API 调用,并在 JSON 正文中提供显示名称:

Authorization: Required with a valid Bearer token
Method: POST
Content-type: application/json

https://graph.microsoft.com/v1.0/applicationTemplates/8adf8e6e-67b2-4cf2-a259-e3dc5476c621/instantiate
{
    "displayname": "Custom OIDC App"
}

从 API 调用中,捕获应用程序 ID 和服务主体 ID 以在后续的 API 调用中使用。

Authorization: Required with a valid Bearer token
Method: PATCH
Content-type: application/json

https://graph.microsoft.com/v1.0/applications/{Application Object ID}
{
    "web": {
    "redirectUris":["https://www.samlapp.com"]},
    "identifierUris":["[https://www.samlapp.com"],
    "requiredResourceAccess": [
    {
        "resourceAppId": "00000003-0000-0000-c000-000000000000",
        "resourceAccess": [
        {
            "id": "7427e0e9-2fba-42fe-b0c0-848c9e6a8182",
            "type": "Scope"
        },
        {
            "id": "e1fe6dd8-ba31-4d61-89e7-88639da4683d",
            "type": "Scope"
        },
        {
            "id": "37f7f235-527c-4136-accd-4a02d197296e",
            "type": "Scope"
        }]
    }]
}

注意

resourceAccess 节点中的 API 权限将向应用程序授予 openid、User.Read 和 offline_access 权限,用于实现登录。 请参阅 Microsoft Graph 权限概述

应用条件访问策略

客户与合作伙伴可使用 Microsoft Graph API 来创建条件访问策略或者将条件访问策略应用到客户的应用程序。 对于合作伙伴,客户可以直接从你的解决方案中应用这些策略,而无需使用 Azure 门户。 要应用 Azure AD 条件访问策略,有两个选项可用:

  • 为应用程序分配条件访问策略
  • 创建新的条件访问策略,并为应用程序分配该策略

使用条件访问策略

有关条件访问策略的列表,请运行以下查询。 获取要修改的策略对象 ID。

Authorization: Required with a valid Bearer token
Method:GET

https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies

若要修补该策略,请在 JSON 正文中将应用程序对象 ID 包括到 includeApplications 的范围内:

Authorization: Required with a valid Bearer token
Method: PATCH

https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies/{policyid}
{
    "displayName":"Existing CA Policy",
    "state":"enabled",
    "conditions": 
    {
        "applications": 
        {
            "includeApplications":[
                "00000003-0000-0ff1-ce00-000000000000", 
                "{Application Object ID}"
            ]
        },
        "users": {
            "includeUsers":[
                "All"
            ] 
        }
    },
    "grantControls": 
    {
        "operator":"OR",
        "builtInControls":[
            "mfa"
        ]
    }
}

创建新的条件访问策略

在 JSON 正文中将应用程序对象 ID 添加到 includeApplications 的范围内:

Authorization: Required with a valid Bearer token
Method: POST

https://graph.microsoft.com/v1.0/identity/conditionalAccess/policies/
{
    "displayName":"New CA Policy",
    "state":"enabled",
    "conditions": 
    {
        "applications": {
            "includeApplications":[
                "{Application Object ID}"
            ]
        },
        "users": {
            "includeUsers":[
                "All"
            ]
        }
    },
    "grantControls": {
        "operator":"OR",
        "builtInControls":[
            "mfa"
        ]
    }
}

若要创建新的 Azure AD 条件访问策略,请参阅条件访问:编程访问

#Policy Template for Requiring Compliant Device

{
    "displayName":"Enforce Compliant Device",
    "state":"enabled",
    "conditions": {
        "applications": {
            "includeApplications":[
                "{Application Object ID}"
            ]
        },
        "users": {
            "includeUsers":[
                "All"
            ]
        }
    },
    "grantControls": {
        "operator":"OR",
        "builtInControls":[
            "compliantDevice",
            "domainJoinedDevice"
        ]
    }
}

#Policy Template for Block

{
    "displayName":"Block",
    "state":"enabled",
    "conditions": {
        "applications": {
            "includeApplications":[
                "{Application Object ID}"
            ]
        },
        "users": {
            "includeUsers":[
                "All"
            ] 
        }
    },
    "grantControls": {
        "operator":"OR",
        "builtInControls":[
            "block"
        ]
    }
}

如果客户将解决方案中的应用程序添加到 Azure AD,则可以使用 Microsoft Graph 自动化管理员同意。 你需要在 API 调用中创建的应用程序的服务主体对象 ID,以及客户的租户中 Microsoft Graph 的服务主体对象 ID。

通过进行以下 API 调用来获取 Microsoft Graph 的服务主体对象 ID:

Authorization: Required with a valid Bearer token
Method:GET

https://graph.microsoft.com/v1.0/serviceprincipals/?$filter=appid eq '00000003-0000-0000-c000-000000000000'&$select=id,appDisplayName

若要自动化管理员同意,请进行以下 API 调用:

Authorization: Required with a valid Bearer token
Method: POST
Content-type: application/json

https://graph.microsoft.com/v1.0/oauth2PermissionGrants
{
    "clientId":"{Service Principal Object ID of Application}",
    "consentType":"AllPrincipals",
    "principalId":null,
    "resourceId":"{Service Principal Object ID Of Microsoft Graph}",
    "scope":"openid user.read offline_access}"
}

获取令牌签名证书

若要获取令牌签名证书的公共部分,可以从应用程序的 Azure AD 元数据终结点使用 GET

Method:GET

https://login.microsoftonline.com/{Tenant_ID}/federationmetadata/2007-06/federationmetadata.xml?appid={Application_ID}

分配用户和组

将应用程序发布到 Azure AD 后,可以将应用分配给用户和组,以确保它显示在“我的应用”门户中。 此分配位于创建应用程序时生成的服务主体对象中。 请参阅“我的应用”门户概述

获取应用程序可能与之关联的 AppRole 实例。 SaaS 应用程序通常与多个 AppRole 实例相关联。 对于自定义应用程序,通常有一个默认的 AppRole 实例。 获取要分配的 AppRole 实例的 ID:

Authorization: Required with a valid Bearer token
Method:GET

https://graph.microsoft.com/v1.0/servicePrincipals/3161ab85-8f57-4ae0-82d3-7a1f71680b27

在 Azure AD 中,获取要分配到应用程序的用户或组的对象 ID。 从先前的 API 调用获取应用角色 ID,并将其与服务主体的修补正文一起提交:

Authorization: Required with a valid Bearer token
Method: PATCH
Content-type: servicePrincipal/json

https://graph.microsoft.com/v1.0/servicePrincipals/3161ab85-8f57-4ae0-82d3-7a1f71680b27
{
    "principalId":"{Principal Object ID of User -or- Group}",
    "resourceId":"{Service Principal Object ID}",
    "appRoleId":"{App Role ID}"
}

合作关系

为帮助保护旧版应用程序,同时使用网络和传送控制器,Microsoft 已与以下应用程序传送控制器 (ADC) 提供商建立了合作关系。

以下 VPN 解决方案提供商与 Azure AD 相连接,以启用 SSO 和多重身份验证 (MFA) 等新式身份验证和授权方法。

以下软件定义边界 (SDP) 解决方案提供商与 Azure AD 相连接,以实现 SSO 和 MFA 等身份验证和授权方法。