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

将基于 OWIN 的 Web API 迁移到 b2clogin.com 或自定义域

重要

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

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

通过在 API 中添加对接受由 b2clogin.com、login.microsoftonline.com 或自定义域颁发的令牌的支持,可以在从 API 中删除对 login.microsoftonline.com 颁发的令牌的支持之前,以分阶段方式迁移 Web 应用程序。

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

先决条件

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

获取令牌颁发者终结点

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

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

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

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

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

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

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

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

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

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

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

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

自定义策略

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

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

获取示例代码

有了两个令牌终结点 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.microsoftonline.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/",
            "https://{your-b2c-tenant}.b2clogin.com/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/"//,
            //"https://your-custom-domain/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.com 终结点检索令牌。

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

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

以前:

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

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

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

在 Web 应用的执行过程中构造终结点字符串时,将在请求令牌时使用基于 b2clogin.com 的终结点。

使用自定义域时:

<!-- Custom domain -->
<add key="ida:AadInstance" value="https://custom-domain/{0}/{1}" />

后续步骤

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

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