azure - 有没有办法使用多个策略来验证 B2C 应用程序
问题描述
我正在使用 B2C 登录页面来验证我的用户。这些用户根据他们的业务选择了多个 IDP,我使用选定的 IDP 创建了多个策略。在基于用户电子邮件的登录页面中,我显示了他的登录页面,其中只有他的相关 IDP。但在我的 Web 应用程序中,我只能在 appsettings.json 中添加一个 注册或登录策略来对用户进行身份验证。是否有任何选项可以在 appsettings.json 文件中使用多个策略或任何其他方式来处理此要求
我当前的 appsettings.json 如下所示
"AzureAdB2C": {
"Instance": "https://login.microsoftonline.com/tfp/",
"ClientId": "******-***-****-****-*******",
"Domain": "mycustomdomain.onmicrosoft.com",
"SignUpSignInPolicyId": "Org-signinsignout"
},
解决方案
您可以通过将请求的策略从控制器方法传递到身份验证中间件来为不同类型的用户调用不同的策略:
public IActionResult LogInForBusinessCustomer(string uiLocale)
{
return LogInFor(Constants.AuthenticationSchemes.B2COpenIdConnect, Constants.Policies.SignUpOrSignInWithWorkAccount, uiLocale);
}
public IActionResult LogInForIndividualCustomer(string uiLocale)
{
return LogInFor(Constants.AuthenticationSchemes.B2COpenIdConnect, Constants.Policies.SignUpOrSignInWithPersonalAccount, uiLocale);
}
public IActionResult LogInForPartner(string uiLocale)
{
return LogInFor(Constants.AuthenticationSchemes.B2BOpenIdConnect, null, uiLocale);
}
private IActionResult LogInFor(string authenticationScheme, string policy)
{
if (!User.Identity.IsAuthenticated)
{
return new ChallengeResult(
authenticationScheme,
new AuthenticationProperties(
new Dictionary<string, string>
{
{Constants.AuthenticationProperties.Policy, policy}
})
{
RedirectUri = Url.Action("LoggedIn", "Account", values: null, protocol: Request.Scheme)
});
}
return RedirectToHome();
}
然后在身份验证中间件中为请求的策略设置重定向 URL:
OnRedirectToIdentityProvider = async context =>
{
var policy = context.Properties.Items.ContainsKey(Constants.AuthenticationProperties.Policy) ? context.Properties.Items[Constants.AuthenticationProperties.Policy] : Constants.Policies.SignUpOrSignInWithPersonalAccount;
var configuration = await GetB2COpenIdConnectConfigurationAsync(context, policy);
context.ProtocolMessage.IssuerAddress = configuration.AuthorizationEndpoint;
if (context.Properties.Items.ContainsKey(Constants.AuthenticationProperties.UILocales))
{
context.ProtocolMessage.SetParameter("ui_locales", context.Properties.Items[Constants.AuthenticationProperties.UILocales]);
}
context.ProtocolMessage.SetParameter("dc", "cdm");
context.ProtocolMessage.SetParameter("slice", "001-000");
},
也请查看此线程
Azure B2C - 在 Azure 中为不同用户类型设置多个登录的单个应用程序
希望能帮助到你。
推荐阅读
- java - Glide 没有从 Firebase 加载图像
- google-app-engine - 如何保护由 GCS 触发的 App Engine Pub/Sub Push Endpoint?
- c# - 每当从 Datepicker 日期和月份位置中选择日期时都会发生变化
- oracle - 尝试访问 http://localhost:8080/ords 时如何使用代码 500 修复此错误页面
- c# - 标准 ashx 文件将无法编译
- c - CodeBlocks 不显示土耳其语字符
- php - 在php中查找具有重复值的键的值的总和
- node.js - 如何修复错误:至少需要一个聚合?- 健身API
- nginx - NGINX - HTTPS 负载均衡器配置
- c++ - 当将 Tcl 中命令的输出重定向到文件时,文件将以 DOS 格式生成