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 参数未包含在身份验证重定向中。
将域提示传递给帐户控制器的唯一方法是使用质询操作。
<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 地址:
非常感谢
要将用户重定向到外部身份提供商,请执行以下操作:
检查您的外部身份提供商的域名。有关详细信息,请参阅 Redirect sign-in to a social provider。
-
在OnRedirectToIdentityProviderFunc函数中,在OnRedirectToIdentityProvider函数中添加如下一行代码:
private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
context.ProtocolMessage.DomainHint = "facebook.com";
// More code
await Task.CompletedTask.ConfigureAwait(false);
}
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..
我正在使用 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 参数未包含在身份验证重定向中。
将域提示传递给帐户控制器的唯一方法是使用质询操作。
<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 地址:
非常感谢
要将用户重定向到外部身份提供商,请执行以下操作:
检查您的外部身份提供商的域名。有关详细信息,请参阅 Redirect sign-in to a social provider。
在OnRedirectToIdentityProviderFunc函数中,在OnRedirectToIdentityProvider函数中添加如下一行代码:
private async Task OnRedirectToIdentityProviderFunc(RedirectContext context)
{
context.ProtocolMessage.DomainHint = "facebook.com";
// More code
await Task.CompletedTask.ConfigureAwait(false);
}
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..