重要
自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息。
本文介绍一种技术,用于在 Web API 中启用对多个令牌颁发者的支持,这些颁发者实现了适用于 .NET 的开放 Web 接口(OWIN)。 将 Azure Active Directory B2C (Azure AD B2C) API 及其应用程序从一个域迁移到另一个域时,支持多个令牌终结点非常有用。 例如,从 login.partner.microsoftonline.cn 到 b2clogin.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.cn 和 login.partner.microsoftonline.cn 终结点,请在 Azure 门户中使用以下过程。
首先选择现有用户流之一:
在 Azure 门户中访问你的 Azure AD B2C 租户
在 “策略”下,选择 “用户流”(策略)
选择现有策略,例如B2C_1_signupsignin1,然后选择“运行用户流”
在页面顶部附近的 “运行用户流 ”标题下,选择超链接以导航到该用户流的 OpenID Connect 发现终结点。
在浏览器中打开的页面,记录
issuer
值,例如:https://your-b2c-tenant.b2clogin.cn/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/v2.0/
使用 “选择域 ”下拉列表选择另一个域,然后再次执行前两个步骤并记录其
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。
- 导航到 Azure AD B2C 租户
- 选择“标识体验框架”
- 选择其中一种信赖方策略,例如 B2C_1A_signup_signin
- 使用 “选择域 ”下拉列表选择域,例如 yourtenant.b2clogin.cn
- 选择“OpenID Connect 发现终结点”下显示的超链接
- 记录
issuer
的值 - 为其他域执行步骤 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
在本部分中,您将更新代码,以指定两个凭证颁发者端点都有效。
在 Visual Studio 中打开 B2C-WebAPI-DotNet.sln 解决方案
在 TaskService 项目中,在编辑器中打开 TaskService\App_Start\Startup.Auth.cs 文件
将以下
using
指令添加到文件顶部:using System.Collections.Generic;
将
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:AadInstance
TaskWebApp\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 中的令牌概述。