将基于 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 门户中使用以下过程 。
首先选择一个现有用户流:
在 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
值 - 为另一个域(例如 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 中启用多个颁发者
在此部分,更新代码以将两个令牌颁发者终结点指定为有效。
在 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 提供,由 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 中的令牌概述。