使用 Azure AD B2C 保护 Azure API 管理 API

了解如何仅限经过 Azure Active Directory B2C (Azure AD B2C) 身份验证的客户端访问 Azure API 管理 API。 按照本文中的说明在 Azure API 管理中创建并测试一个入站策略,该策略仅允许那些包含 Azure AD B2C 颁发的有效访问令牌的请求进行访问。

先决条件

在开始之前,请确保已准备好以下资源:

获取 Azure AD B2C 应用程序 ID

使用 Azure AD B2C 保护 Azure API 管理中的 API 时,你需要为你在 Azure API 管理中创建的入站策略提供多个值。 首先,请记下以前在 Azure AD B2C 租户中创建的应用程序的 ID。 如果你使用所创建的应用程序来满足先决条件,请使用 webbapp1 的应用程序 ID。

若要在 Azure AD B2C 租户中注册应用程序,可以使用新的、统一的“应用注册”体验,也可以使用旧版“应用程序”体验。 详细了解新的注册体验

  1. 登录 Azure 门户
  2. 如果有权访问多个租户,请选择顶部菜单中的“设置”图标,切换到“目录 + 订阅”菜单中的 Azure AD B2C 租户。
  3. 在左侧窗格中,选择“Azure AD B2C”。 另外,你还可以选择“所有服务”,然后搜索并选择“Azure AD B2C”。
  4. 选择“应用注册”,然后选择“拥有的应用程序”选项卡 。
  5. 记录 webapp1 或你之前创建的其他应用程序的“应用程序(客户端) ID”列中的值。

获取令牌颁发者终结点

接下来,获取某个 Azure AD B2C 用户流的已知配置 URL。 还需要获取你想在 Azure API 管理中支持的令牌颁发者终结点 URI。

  1. Azure 门户中,转到你的 Azure AD B2C 租户。

  2. 在“策略”下,选择“用户流” 。

  3. 选择一个现有策略(例如 B2C_1_signupsignin1),然后选择“运行用户流”。

  4. 记录页面顶部附近的“运行用户流”标题下显示的超链接中的 URL。 此 URL 是用户流的 OpenID Connect 已知发现终结点。在下一部分,当你在 Azure API 管理中配置入站策略时,将要使用此 URL。

    屏幕截图显示了 Azure 门户的“运行用户流”页上的已知 URI 超链接。

  5. 选择该超链接以转到 OpenID Connect 已知配置页。

  6. 在浏览器中打开的页面上,记录 issuer 值。 例如:

    https://<tenant-name>.b2clogin.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/

    在下一部分,当你在 Azure API 管理中配置 API 时,将要使用此值。

现在,你应已记下了要在下一部分使用的两个 URL:OpenID Connect 已知配置终结点 URL,以及颁发者 URI。 例如:

https://<tenant-name>.b2clogin.cn/<tenant-name>.partner.onmschina.cn/B2C_1_signupsignin1/v2.0/.well-known/openid-configuration
https://<tenant-name>.b2clogin.cn/99999999-0000-0000-0000-999999999999/v2.0/

在 Azure API 管理中配置入站策略

现已准备好在 Azure API 管理中添加用于验证 API 调用的入站策略。 通过添加一项用于验证访问令牌中的受众和颁发者的 JSON Web 令牌 (JWT) 验证策略,可以确保只接受带有有效令牌的 API 调用。

  1. Azure 门户中,转到你的 Azure API 管理实例。

  2. 选择“API”。

  3. 选择要使用 Azure AD B2C 保护的 API。

  4. 选择“设计”选项卡。

  5. 在“入站处理”下,选择“</>”以打开“策略代码编辑器”。

  6. 将以下 <validate-jwt> 标记放入 <inbound> 策略中,然后执行以下操作:

    a. 使用策略的已知配置 URL 更新 <openid-config> 元素中的 url 值。
    b. 使用你之前在 B2C 租户中创建的应用程序(例如 webapp1)的应用程序 ID 更新 <audience> 元素。
    c. 使用前面记下的令牌颁发者终结点更新 <issuer> 元素。

    <policies>
        <inbound>
            <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
                <openid-config url="https://<tenant-name>.b2clogin.cn/<tenant-name>.partner.onmschina.cn/B2C_1_signupsignin1/v2.0/.well-known/openid-configuration" />
                <audiences>
                    <audience>44444444-0000-0000-0000-444444444444</audience>
                </audiences>
                <issuers>
                    <issuer>https://<tenant-name>.b2clogin.cn/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
                </issuers>
            </validate-jwt>
            <base />
        </inbound>
        <backend> <base /> </backend>
        <outbound> <base /> </outbound>
        <on-error> <base /> </on-error>
    </policies>
    

支持多个应用程序和颁发者

通常有多个应用程序会与单个 REST API 交互。 若要使 API 接受用于多个应用程序的令牌,请将其应用程序 ID 添加到 Azure API 管理入站策略中的 <audiences> 元素。

<!-- Accept tokens intended for these recipient applications -->
<audiences>
    <audience>44444444-0000-0000-0000-444444444444</audience>
    <audience>66666666-0000-0000-0000-666666666666</audience>
</audiences>

同样,若要支持多个令牌颁发者,请将其终结点 URI 添加到 Azure API 管理入站策略中的 <issuers> 元素。

<!-- Accept tokens from multiple issuers -->
<issuers>
    <issuer>https://<tenant-name>.b2clogin.cn/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
    <issuer>https://login.partner.microsoftonline.cn/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
</issuers>

迁移到 b2clogin.cn

如果你的某个 Azure API 管理 API 可验证旧 login.partner.microsoftonline.cn 终结点颁发的令牌,则应迁移该 API 及调用它的应用程序,以使用 b2clogin.cn 颁发的令牌。

可以遵循以下常规过程来执行分步迁移:

  1. 在 Azure API 管理入站策略中添加对 b2clogin.cn 和 login.partner.microsoftonline.cn 颁发的令牌的支持。
  2. 逐个更新应用程序,以从 b2clogin.cn 终结点获取令牌。
  3. 当所有应用程序都能够正确地从 b2clogin.cn 获取令牌后,请从 API 中删除对 login.partner.microsoftonline.cn 颁发的令牌的支持。

下面的 Azure API 管理入站策略示例说明了如何接受 b2clogin.cn 和 login.partner.microsoftonline.cn 颁发的令牌。 另外,此策略还支持来自两个应用程序的 API 请求。

<policies>
    <inbound>
        <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
            <openid-config url="https://<tenant-name>.b2clogin.cn/<tenant-name>.partner.onmschina.cn/B2C_1_signupsignin1/v2.0/.well-known/openid-configuration" />
            <audiences>
                <audience>44444444-0000-0000-0000-444444444444</audience>
                <audience>66666666-0000-0000-0000-666666666666</audience>
            </audiences>
            <issuers>
                <issuer>https://login.partner.microsoftonline.cn/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
                <issuer>https://<tenant-name>.b2clogin.cn/99999999-0000-0000-0000-999999999999/v2.0/</issuer>
            </issuers>
        </validate-jwt>
        <base />
    </inbound>
    <backend> <base /> </backend>
    <outbound> <base /> </outbound>
    <on-error> <base /> </on-error>
</policies>

后续步骤

有关 Azure API 管理策略的其他信息,请参阅 Azure API 管理策略参考索引

若要了解如何将基于 OWIN 的 Web API 及其应用程序迁移到 b2clogin.cn,请参阅将基于 OWIN 的 Web API 迁移到 b2clogin.cn