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

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

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

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

先决条件

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

获取令牌颁发者终结点

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

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

  1. Azure 门户中导航到你的 Azure AD B2C 租户

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

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

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

    Well-known URI hyperlink in the Run now page of the Azure portal

  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. 为另一个域(例如 login.partner.microsoftonline.cn)执行步骤 4-6

获取示例代码

现在,你已拥有两个令牌终结点 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 提供,由 OWIN 中间件在 Startup.Auth.cs 中代码的下一部分中使用。 指定多个有效颁发者后,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 应用中的终结点

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

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

更改 TaskWebApp 的 Web.config 中的 ida:AadInstance 值,使其引用 {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 的终结点。

后续步骤

本文介绍了一种配置 Web API(该 API 实现 Microsoft OWIN 中间件 (Katana))的方法,以接受来自多个颁发者终结点的令牌。 你可能会注意到,如果希望针对自己的租户构建并运行这些项目,则需要更改 TaskService 和 TaskWebApp 项目的 Web.Config 文件中的其他几个字符串。 如果希望看到项目实际运行,欢迎对其进行适当地修改,但此操作的完整演练超出了本文的范围。

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