将基于 OWIN 的 Web API 迁移到 b2clogin.cn

重要

自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息

本文介绍一种技术,用于在 Web API 中启用对多个令牌颁发者的支持,这些颁发者实现了适用于 .NET 的开放 Web 接口(OWIN)。 将 Azure Active Directory B2C (Azure AD B2C) API 及其应用程序从一个域迁移到另一个域时,支持多个令牌终结点非常有用。 例如,从 login.partner.microsoftonline.cnb2clogin.cn

通过在 API 中添加对接受 b2clogin.cn 和 login.partner.microsoftonline.cn 颁发的令牌的支持,可以在从 API 中删除对 login.partner.microsoftonline.cn 颁发的令牌的支持之前,以分阶段方式迁移 Web 应用程序。

以下部分演示了如何在使用 Microsoft OWIN 中间件组件(Katana)的 Web API 中启用多个颁发者的示例。 尽管代码示例特定于 Microsoft OWIN 中间件,但常规技术应适用于其他 OWIN 库。

先决条件

在继续执行本文中的步骤之前,需要准备好以下 Azure AD B2C 资源:

获取令牌颁发者终结点

首先,您需要为想要在 API 中支持的每个颁发者获取令牌颁发者终结点 URI。 若要获取 Azure AD B2C 租户支持的 b2clogin.cnlogin.partner.microsoftonline.cn 终结点,请在 Azure 门户中使用以下过程。

首先选择现有用户流之一:

  1. Azure 门户中访问你的 Azure AD B2C 租户

  2. “策略”下,选择 “用户流”(策略)

  3. 选择现有策略,例如B2C_1_signupsignin1,然后选择“运行用户流

  4. 在页面顶部附近的 “运行用户流 ”标题下,选择超链接以导航到该用户流的 OpenID Connect 发现终结点。

    Azure 门户“立即运行”页面中的著名 URI 超链接

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

    https://your-b2c-tenant.b2clogin.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/

  6. 使用 “选择域 ”下拉列表选择另一个域,然后再次执行前两个步骤并记录其 issuer 值。

现在你应该已经记录了两个 URI,它们类似于:

https://login.partner.microsoftonline.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/
https://your-b2c-tenant.b2clogin.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/

自定义策略

如果你有自定义策略而不是用户流,则可以使用类似的过程来获取颁发者 URI。

  1. 导航到 Azure AD B2C 租户
  2. 选择“标识体验框架
  3. 选择其中一种信赖方策略,例如 B2C_1A_signup_signin
  4. 使用 “选择域 ”下拉列表选择域,例如 yourtenant.b2clogin.cn
  5. 选择“OpenID Connect 发现终结点”下显示的超链接
  6. 记录issuer的值
  7. 为其他域执行步骤 4-6,例如 login.partner.microsoftonline.cn

获取示例代码

有了两个令牌终结点 URI 后,需要更新代码,以指定这两个终结点都是有效的颁发者。 若要演练示例,请下载或克隆示例应用程序,然后更新示例以支持这两个终结点作为有效的颁发者。

下载存档: active-directory-b2c-dotnet-webapp-and-webapi-master.zip

git clone https://github.com/Azure-Samples/active-directory-b2c-dotnet-webapp-and-webapi.git

在 Web API 中启用多个颁发者

在本部分中,您将更新代码,以指定两个凭证颁发者端点都有效。

  1. 在 Visual Studio 中打开 B2C-WebAPI-DotNet.sln 解决方案

  2. TaskService 项目中,在编辑器中打开 TaskService\App_Start\Startup.Auth.cs 文件

  3. 将以下 using 指令添加到文件顶部:

    using System.Collections.Generic;

  4. ValidIssuers 属性添加到定义中 TokenValidationParameters ,并指定在上一节中记录的两个 URI:

    TokenValidationParameters tvps = new TokenValidationParameters
    {
        // Accept only those tokens where the audience of the token is equal to the client ID of this app
        ValidAudience = ClientId,
        AuthenticationType = Startup.DefaultPolicy,
        ValidIssuers = new List<string> {
            "https://login.partner.microsoftonline.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/",
            "https://{your-b2c-tenant}.b2clogin.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/"
        }
    };
    

TokenValidationParameters 由 MSAL.NET 提供,由 Startup.Auth.cs 中下一部分代码中的 OWIN 中间件使用。 指定了多个有效的颁发者后,OWIN 应用程序管道会意识到这两个令牌终结点都是有效的颁发者。

app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions
{
    // This SecurityTokenProvider fetches the Azure AD B2C metadata &  from the OpenID Connect metadata endpoint
    AccessTokenFormat = new JwtFormat(tvps, new tCachingSecurityTokenProvider(String.Format(AadInstance, ultPolicy)))
});

如前所述,其他 OWIN 库通常提供类似的工具来支持多个颁发者。 尽管为每个库提供的示例不在本文的作用域之外,但大多数库都可以使用类似的技术。

在网页应用中切换端点

由于 Web API 现在都支持这两个 URI,现在需要更新 Web 应用程序,以便从 b2clogin.cn 终结点检索令牌。

例如,可以通过修改 ida:AadInstanceTaskWebApp\Web.config 项目中的值,将示例 Web 应用程序配置为使用新终结点。

更改 ida:AadInstance TaskWebApp Web.config 中的值,使其引用 {your-b2c-tenant-name}.b2clogin.cn 而不是 login.partner.microsoftonline.cn

以前:

<!-- Old value -->
<add key="ida:AadInstance" value="https://login.partner.microsoftonline.cn/tfp/{0}/{1}" />

晚于(将 {your-b2c-tenant} 替换为你的 B2C 租户名称):

<!-- New value -->
<add key="ida:AadInstance" value="https://{your-b2c-tenant}.b2clogin.cn/tfp/{0}/{1}" />

在 Web 应用执行期间构造终结点字符串时,在请求令牌时会使用基于 b2clogin.cn 的终结点。

后续步骤

本文介绍了配置实现 Microsoft OWIN 中间件 (Katana) 的 Web API 以接受来自多个颁发者终结点的令牌的方法。 正如你可能注意到的,如果要针对自己的租户生成和运行这些项目,则 TaskService 和 TaskWebApp 项目的 Web.Config 文件中还有其他几个字符串需要更改。 如果您希望查看项目的实际效果,欢迎对其进行适当修改,但本文并不包含完整的操作指南。

有关 Azure AD B2C 发出的不同类型的安全令牌的详细信息,请参阅 Azure Active Directory B2C 中的令牌概述