使用 Azure AD B2C 在 WPF 桌面应用中启用身份验证选项

重要

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

本文介绍为 Windows Presentation Foundation(WPF)桌面应用程序自定义和增强 Azure Active Directory B2C(Azure AD B2C)身份验证体验的方法。

在开始之前,请熟悉 使用 Azure AD B2C 一文在示例 WPF 桌面应用中配置身份验证。

预填充登录名称

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

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

  1. 如果使用自定义策略,请添加所需的输入声明,如 设置直接登录中所述。
  2. 查找Microsoft身份验证库(MSAL)配置对象,然后使用登录提示添加 withLoginHint() 方法。
authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithLoginHint("bob@contoso.com")
    .ExecuteAsync();

预先选择标识提供者

如果将应用程序的登录旅程配置为包含社交帐户(如 Facebook、LinkedIn 或 Google),则可以指定 domain_hint 参数。 此查询参数向 Azure AD B2C 提供有关应该用于登录的社交标识提供者的提示。 例如,如果应用程序指定 domain_hint=facebook.com,登录流将直接转到 Facebook 登录页。

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

  1. 检查外部标识提供者的域名。 有关详细信息,请参阅将登录重定向到社交服务提供商
  2. 创建或使用现有的 Dictionary 对象来存储额外的查询参数。
  3. 将具有相应域名的 domain_hint 参数添加到字典(例如,facebook.com)。
  4. 将额外的查询参数对象传递到 MSAL 配置对象的 WithExtraQueryParameters 方法中。
Dictionary<string, string> extraQueryParameters = new Dictionary<string, string>();
extraQueryParameters.Add("domain_hint", "facebook.com");

authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync();

指定 UI 语言

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

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

  1. 配置语言自定义
  2. 创建或使用现有的 Dictionary 对象来存储额外的查询参数。
  3. 将具有相应语言代码的 ui_locales 参数添加到字典(例如,en-us)。
  4. 将额外的查询参数对象传递到 MSAL 配置对象的 WithExtraQueryParameters 方法中。
Dictionary<string, string> extraQueryParameters = new Dictionary<string, string>();
extraQueryParameters.Add("ui_locales", "en-us");

authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync();

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

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

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

  1. 配置 ContentDefinitionParameters 元素。
  2. 创建或使用现有的 Dictionary 对象来存储额外的查询参数。
  3. 添加自定义查询字符串参数,例如 campaignId。 设置参数值(例如,germany-promotion)。
  4. 将额外的查询参数对象传递到 MSAL 配置对象的 WithExtraQueryParameters 方法中。
Dictionary<string, string> extraQueryParameters = new Dictionary<string, string>();
extraQueryParameters.Add("campaignId", "germany-promotion");

authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync();

传递 ID 令牌提示

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

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

  1. 在自定义策略中,定义 ID 令牌提示技术配置文件
  2. 在代码中,生成或获取 ID 令牌,然后将令牌设置为变量(例如,idToken)。
  3. 创建或使用现有的 Dictionary 对象来存储额外的查询参数。
  4. 使用存储 ID 令牌的相应变量添加 id_token_hint 参数。
  5. 将额外的查询参数对象传递到 MSAL 配置对象的 extraQueryParameters 属性中。
Dictionary<string, string> extraQueryParameters = new Dictionary<string, string>();
extraQueryParameters.Add("id_token_hint", idToken);

authResult = await app.AcquireTokenInteractive(App.ApiScopes)
    .WithParentActivityOrWindow(new WindowInteropHelper(this).Handle)
    .WithExtraQueryParameters(extraQueryParameters)
    .ExecuteAsync();

配置日志记录

MSAL 库生成有助于诊断问题的日志消息。 应用可以配置日志记录。 该应用还可以让你对详细信息级别以及是否记录个人和组织数据进行自定义控制。

建议创建 MSAL 日志记录回调,并为用户提供在遇到身份验证问题时提交日志的方法。 MSAL 提供以下级别的日志记录详细信息:

  • 错误:出现了错误,并生成了错误。 此级别用于调试和识别问题。
  • 警告:不存在错误或故障,但信息用于诊断和查明问题。
  • 信息:MSAL 记录用于信息性目的的事件,不一定用于调试。
  • 详细:这是默认级别。 MSAL 记录库行为的完整详细信息。

默认情况下,MSAL 记录器不会捕获任何个人或组织数据。 如果你决定这样做,该库提供了启用个人数据和组织数据的日志记录的选项。

以下代码片段演示如何配置 MSAL 日志记录:

PublicClientApp = PublicClientApplicationBuilder.Create(ClientId)
    .WithB2CAuthority(AuthoritySignUpSignIn)
    .WithRedirectUri(RedirectUri)
    .WithLogging(Log, LogLevel.Info, false) // don't log P(ersonally) I(dentifiable) I(nformation) details on a regular basis
    .Build();

配置重定向 URI

桌面应用注册 过程中,选择重定向 URI 时,请记住以下重要注意事项:

  • 开发:对于桌面应用中的开发用途,可以将重定向 URI 设置为 http://localhost,Azure AD B2C 将遵循请求中的任何端口。 如果已注册的 URI 包含端口,Azure AD B2C 将仅使用该端口。 例如,如果已注册的重定向 URI http://localhost,则请求中的重定向 URI 可以 http://localhost:<randomport>。 如果已注册的重定向 URI http://localhost:8080,则请求中的重定向 URI 必须 http://localhost:8080
  • 唯一:重定向 URI 的方案对于每个应用程序都必须是唯一的。 在示例 com.onmicrosoft.contosob2c.exampleapp://oauth/redirect中,com.onmicrosoft.contosob2c.exampleapp 是方案。 应遵循此模式。 如果两个应用程序共享相同的方案,则用户可以选择应用程序。 如果用户选择不正确,则登录将失败。
  • 完成:重定向 URI 必须同时具有方案和路径。 路径在域之后必须至少包含一个斜杠字符。 例如,//oauth/ 工作,//oauth 失败。 不要在 URI 中包含特殊字符。 例如,不允许下划线字符 (_) 。

后续步骤