使用 Azure AD B2C 在调用 Web API 的 Web 应用中配置身份验证选项

Important

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

本文介绍为调用 Web API 的 Web 应用程序自定义和增强 Azure Active Directory B2C (Azure AD B2C) 身份验证体验的方法。 在开始之前,请熟悉以下文章:

使用自定义域

通过使用 自定义域,可以完全打造身份验证 URL 的品牌。 从用户的角度来看,用户在身份验证过程中保留在域上,而不是重定向到Azure AD B2C b2clogin.cn 域名。

若要删除对 URL 中“b2c”的所有引用,还可以将身份验证请求 URL 中的 B2C 租户名称 contoso.partner.onmschina.cn 替换为租户 ID GUID。 例如,可以更改为 https://fabrikamb2c.b2clogin.cn/contoso.partner.onmschina.cn/https://account.contosobank.co.uk/<tenant ID GUID>/.

若要在身份验证 URL 中使用自定义域和租户 ID,请按照 “启用自定义域”中的指南进行操作。 在项目根文件夹下,打开 appsettings.json 该文件。 此文件包含有关 Azure AD B2C 标识提供者的信息。

  • 使用 Instance 自定义域更新条目。
  • Domain使用租户 ID 更新条目。 有关详细信息,请参阅 “使用租户 ID”。

更改 的应用设置显示在以下 JSON 代码中:

"AzureAdB2C": {
  "Instance": "https://contoso.b2clogin.cn",
  "Domain": "tenant-name.partner.onmschina.cn",
  ...
}

更改 的应用设置显示在以下 JSON 代码中:

"AzureAdB2C": {
  "Instance": "https://login.contoso.com",
  "Domain": "00000000-0000-0000-0000-000000000000",
  ...
}

支持高级方案

Microsoft 标识平台 AddMicrosoftIdentityWebAppAuthentication API 中的方法允许开发人员为高级身份验证方案添加代码或订阅 OpenIdConnect 事件。 例如,可以订阅 OnRedirectToIdentityProvider,可以使用该请求自定义应用发送到Azure AD B2C 的身份验证请求。

若要支持高级方案,请打开 Startup.cs 文件,并在函数中 ConfigureServices 将该文件 AddMicrosoftIdentityWebAppAuthentication 替换为以下代码片段:

// Configuration to sign in users with Azure AD B2C

//services.AddMicrosoftIdentityWebAppAuthentication(Configuration, "AzureAdB2C");

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
        .AddMicrosoftIdentityWebApp(options =>
{
    Configuration.Bind("AzureAdB2C", options);
    options.Events ??= new OpenIdConnectEvents();
    options.Events.OnRedirectToIdentityProvider += OnRedirectToIdentityProviderFunc;
});

上面的代码使用对 OnRedirectToIdentityProviderFunc 方法的引用添加 OnRedirectToIdentityProviderProvider 事件 。 将以下代码片段添加到 Startup.cs 类。

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Custom code here
    
    // Don't remove this line
    await Task.CompletedTask.ConfigureAwait(false);
}

可以使用上下文参数在控制器和 OnRedirectToIdentityProvider 函数之间传递参数。

预填充登录名称

在登录用户旅程中,你的应用可能面向特定用户。 当应用面向用户时,它可以在授权请求 login_hint 中使用用户的登录名称指定查询参数。 Azure AD B2C 会自动填充登录名,用户只需提供密码。

若要预填充登录名称,请执行以下操作:

  1. 如果使用自定义策略,请添加所需的输入声明,如 “设置直接登录”中所述。

  2. 完成 支持高级方案 过程。

  3. 将以下代码行添加到 OnRedirectToIdentityProvider 函数:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.LoginHint = "emily@contoso.com";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

预先选择标识提供者

如果将应用程序的登录旅程配置为包含社交帐户,则可以指定 domain_hint 参数。 此查询参数提供有关应用于登录的社交标识提供者Azure AD B2C 的提示。

若要将用户重定向到外部标识提供者,请执行以下操作:

  1. 检查外部标识提供者的域名。 有关详细信息,请参阅将登录重定向到社交服务提供商

  2. 完成 支持高级方案 过程。

  3. OnRedirectToIdentityProviderFunc 函数中,将以下代码行添加到 OnRedirectToIdentityProvider 函数:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.DomainHint = "<YOUR_DOMAIN_HINT>";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

指定 UI 语言

Azure AD B2C 中的语言自定义使用户流能够适应各种语言以满足客户的需求。 有关详细信息,请参阅 语言自定义

若要设置首选语言,请执行以下操作:

  1. 配置语言自定义

  2. 完成 支持高级方案 过程。

  3. 将以下代码行添加到 OnRedirectToIdentityProvider 函数:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.UiLocales = "es";
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

传递自定义查询字符串参数

使用自定义策略,可以传递自定义查询字符串参数。 一个很好的用例示例是想要 动态更改页面内容

若要传递自定义查询字符串参数,请执行以下操作:

  1. 配置 ContentDefinitionParameters 元素。

  2. 完成 支持高级方案 过程。

  3. 将以下代码行添加到 OnRedirectToIdentityProvider 函数:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      context.ProtocolMessage.Parameters.Add("campaignId", "123");
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

传递 ID 令牌提示

信赖方应用程序可以将入站 JSON Web 令牌 (JWT) 作为 OAuth2 授权请求的一部分发送。 入站令牌是有关用户或授权请求的提示。 Azure AD B2C 验证令牌,然后提取声明。

若要在身份验证请求中包含 ID 令牌提示,请执行以下操作:

  1. 完成 支持高级方案 过程。

  2. 在自定义策略中,定义 ID 令牌提示技术配置文件

  3. 将以下代码行添加到 OnRedirectToIdentityProvider 函数:

    private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
    {
      // The idTokenHint variable holds your ID token 
      context.ProtocolMessage.IdTokenHint = idTokenHint
    
      // More code
      await Task.CompletedTask.ConfigureAwait(false);
    }
    

帐户控制器

如果要自定义 登录注册注销 操作,建议创建自己的控制器。 拥有自己的控制器时,可以在控制器和身份验证库之间传递参数。 AccountController NuGet 包的Microsoft.Identity.Web.UI一部分,用于处理登录和注销操作。 可以在Microsoft标识 Web 库中找到其实现。

以下代码片段演示了使用 SignIn 操作的自定义MyAccountController。 该操作将传递给身份验证库的参数 campaign_id

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.OpenIdConnect;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;


namespace mywebapp.Controllers
{
    [AllowAnonymous]
    [Area("MicrosoftIdentity")]
    [Route("[area]/[controller]/[action]")]
    public class MyAccountController : Controller
    {

        [HttpGet("{scheme?}")]
        public IActionResult SignIn([FromRoute] string scheme)
        {
            scheme ??= OpenIdConnectDefaults.AuthenticationScheme;
            var redirectUrl = Url.Content("~/");
            var properties = new AuthenticationProperties { RedirectUri = redirectUrl };
            properties.Items["campaign_id"] = "1234";
            return Challenge(properties, scheme);
        }

    }
}

_LoginPartial.cshtml 视图中,将登录链接更改为控制器

<form method="get" asp-area="MicrosoftIdentity" asp-controller="MyAccount" asp-action="SignIn">

OnRedirectToIdentityProvider调用中 Startup.cs ,可以读取自定义参数:

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    // Read the custom parameter
    var campaign_id = (context.Properties.Items.ContainsKey("campaign_id"))
    
    // Add your custom code here
    
    await Task.CompletedTask.ConfigureAwait(false);
}

基于角色的访问控制

使用 ASP.NET Core中的授权,可以使用基于角色的授权基于声明的授权基于策略的授权来检查用户是否有权访问受保护的资源。

ConfigureServices 方法中添加 AddAuthorization 方法,该方法添加授权模型。 以下示例创建名为 的策略。 策略检查是否存在声明 EmployeeNumber 。 声明的值必须是以下 ID 之一:1、2、3、4 或 5。

services.AddAuthorization(options =>
    {
        options.AddPolicy("EmployeeOnly", policy =>
              policy.RequireClaim("EmployeeNumber", "1", "2", "3", "4", "5"));
    });

通过使用 AuthorizeAttribute 及其各种参数来控制 ASP.NET Core中的授权。 将属性的最基本形式 [Authorize] 应用于控制器、操作或 Razor 页面时,将限制对该组件的经过身份验证的用户的访问权限。

将策略应用于控制器,方法是使用 [Authorize] 具有策略名称的属性。 以下代码限制对由EmployeeOnly策略授权的用户对操作的访问Claims

[Authorize(Policy = "EmployeeOnly")]
public IActionResult Claims()
{
    return View();
}

后续步骤

若要了解详细信息,请参阅 ASP.NET Core 中的授权简介