Azure B2C:如何在来自 asp.net 核心控件的 Sign Up/In 链接中包含域提示

Azure B2C: how to Include domain hint in Sign Up/In links from asp.net core control

我正在使用 Azure B2C,我想使用 Google 来登录用户。我想在我的 asp.net 核心页面中做这样的事情来实现它:

<a asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignIn" asp-route-domainHint="google.com">Google Sign Up/In</a>

以便 Google 挑战页面用于登录用户。

但是,此代码会导致使用非社交(“有机”)登录页面,因为 domain_hint 参数未包含在身份验证重定向中。

查看帐户控制器代码,此处:https://github.com/AzureAD/microsoft-identity-web/blob/master/src/Microsoft.Identity.Web.UI/Areas/MicrosoftIdentity/Controllers/AccountController.cs

将域提示传递给帐户控制器的唯一方法是使用质询操作。

<a asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="Challenge" asp-route-domainHint="google.com">Google Sign Up/In</a>

这几乎行得通。

但它会再次循环回到 Google 挑战页面,在您选择 google 帐户后,重复。

有没有办法传递域提示并使用帐户控制器的登录操作?或者从 asp.net 核心页面生成登录调用并包含域提示的其他方法?

我看过这个答案,但不想从头开始构建整个 href 地址:

非常感谢

要将用户重定向到外部身份提供商,请执行以下操作:

  1. 检查您的外部身份提供商的域名。有关详细信息,请参阅 Redirect sign-in to a social provider

  2. 完成Support advanced scenarios程序。

  3. 在OnRedirectToIdentityProviderFunc函数中,在OnRedirectToIdentityProvider函数中添加如下一行代码:

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
  context.ProtocolMessage.DomainHint = "facebook.com";

  // More code
  await Task.CompletedTask.ConfigureAwait(false);
}

https://docs.microsoft.com/en-us/azure/active-directory-b2c/enable-authentication-web-application-options#preselect-an-identity-provider

Jas Suri 的回答很有帮助,但我完成了一些与代码相关的步骤来完成解决方案:

要将 domain_hint 参数添加到身份验证 link 中,请将一些代码添加到 ASP.NET Core 项目的 Startup class 的 ConfigureServices() 方法中:

services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(options =>
    {
        Configuration.Bind("AzureAdB2C", options); // Assuming an appsettings.json section named AzureAdB2C with config data
        options.Events ??= new OpenIdConnectEvents();
        options.Events.OnRedirectToIdentityProvider += OnRedirectToIdentityProviderFunc;
  });

关键部分是订阅 OnRedirectToIdentityProvider 事件。在 Startup.cs 中为其添加一个事件处理程序,它可能如下所示:

private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
    var domainHint = context.HttpContext.Request.Query["domainHint"];
    context.ProtocolMessage.DomainHint = domainHint.Count > 0 ? domainHint[0] : null;
    await Task.CompletedTask.ConfigureAwait(false);
}

上面的中间行从查询字符串中获取域提示。因此,您必须按如下方式在剃刀视图中设置它的值。请注意 asp-route-domainHint 属性,ASP.NET 核心将其作为查询字符串值添加到呈现的 Href。

<a asp-area="MicrosoftIdentity" asp-controller="Account" asp-action="SignIn" asp-route-domainHint="google.com">Google Sign Up/In</a>

在最终呈现的 HTML 中,此 link 变为(注意 domainHint querystring 参数):

<a href="/MicrosoftIdentity/Account/SignIn?domainHint=google.com">Google Sign Up/In</a>

当用户单击 link 时,Microsoft.Identity.Web 中的帐户控制器会将用户重定向到 Microsoft 的身份验证 link(请注意附近的 domain_hint 参数最后)导致社交身份验证提供程序的屏幕全屏显示:

https://your-ADB2C-intance/your-ADB2C-domain/b2c_1a_signup_signin/oauth2/v2.0/authorize?client_id=..etc..etc....&domain_hint=google.com&state=..etc..etc..