将 Azure AD B2C 租户策略连接到已注册的应用
Connecting Azure AD B2C tenant policies to a registered app
我试图找出为什么使用 ADAL 连接到 Azure AD B2C 的具有 OpenID Connect 身份验证的 .NET Core 2.0 Web 应用程序不与我的 Azure AD B2C 租户配置通信,最重要的是登录策略.我的应用与 this 非常相似,只是我使用的是 Azure AD Graph。
我的 "authority" AuthenticationContext
是
https://login.microsoftonline.com/organizationname.onmicrosoft.com
因此,用户被迫使用 Microsoft 帐户或带有租户域的邮件登录,我希望用户使用他的个人租户帐户登录。这些策略不应该自动应用吗?我觉得我可能在这里遗漏了一些重要的东西。
该应用程序位于 Azure 中的已注册应用程序中,并拥有所需的所有权限。
我基本上需要将该租户的策略连接到我的应用程序的身份验证系统,以便它接受本地租户帐户,而不仅仅是来自 Microsoft 的帐户。
或者更简单的话:如何将红圈中的部分添加到url?
您引用的示例适用于常规 Azure AD。
查看 this sample for Azure AD B2C with .Net Core 2.0, in particular OpenIdConnectOptionsSetup.cs and AzureAdB2COptions.cs。
要牢记的关键事项:
权限具有以下格式:https://login.microsoftonline.com/tfp/<yourtenant.onmicrosoft.com>/<default_policy>/v2.0
尽管我引用的示例会自动为您构建它。通过使用此权限,OWIN 中间件和 MSAL 都将自动从元数据端点获取 ?policy=b2c_1_x
参数。
public AzureAdB2COptions()
{
AzureAdB2CInstance = "https://login.microsoftonline.com/tfp";
}
//...other init code
public string Authority => $"{AzureAdB2CInstance}/{Tenant}/{DefaultPolicy}/v2.0";
您应该使用 MSAL 兑换代币,而不是 ADAL。
public async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context)
{
var code = context.ProtocolMessage.Code;
string signedInUserID = context.Principal.FindFirst(ClaimTypes.NameIdentifier).Value;
TokenCache userTokenCache = new MSALSessionCache(signedInUserID, context.HttpContext).GetMsalCacheInstance();
ConfidentialClientApplication cca = new ConfidentialClientApplication(AzureAdB2COptions.ClientId, AzureAdB2COptions.Authority, AzureAdB2COptions.RedirectUri, new ClientCredential(AzureAdB2COptions.ClientSecret), userTokenCache, null);
try
{
AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, AzureAdB2COptions.ApiScopes.Split(' '));
context.HandleCodeRedemption(result.AccessToken, result.IdToken);
}
catch (Exception ex)
{
//Handle
}
}
我试图找出为什么使用 ADAL 连接到 Azure AD B2C 的具有 OpenID Connect 身份验证的 .NET Core 2.0 Web 应用程序不与我的 Azure AD B2C 租户配置通信,最重要的是登录策略.我的应用与 this 非常相似,只是我使用的是 Azure AD Graph。
我的 "authority" AuthenticationContext
是
https://login.microsoftonline.com/organizationname.onmicrosoft.com
因此,用户被迫使用 Microsoft 帐户或带有租户域的邮件登录,我希望用户使用他的个人租户帐户登录。这些策略不应该自动应用吗?我觉得我可能在这里遗漏了一些重要的东西。
该应用程序位于 Azure 中的已注册应用程序中,并拥有所需的所有权限。
我基本上需要将该租户的策略连接到我的应用程序的身份验证系统,以便它接受本地租户帐户,而不仅仅是来自 Microsoft 的帐户。
或者更简单的话:如何将红圈中的部分添加到url?
您引用的示例适用于常规 Azure AD。
查看 this sample for Azure AD B2C with .Net Core 2.0, in particular OpenIdConnectOptionsSetup.cs and AzureAdB2COptions.cs。
要牢记的关键事项:
权限具有以下格式:
https://login.microsoftonline.com/tfp/<yourtenant.onmicrosoft.com>/<default_policy>/v2.0
尽管我引用的示例会自动为您构建它。通过使用此权限,OWIN 中间件和 MSAL 都将自动从元数据端点获取?policy=b2c_1_x
参数。public AzureAdB2COptions() { AzureAdB2CInstance = "https://login.microsoftonline.com/tfp"; } //...other init code public string Authority => $"{AzureAdB2CInstance}/{Tenant}/{DefaultPolicy}/v2.0";
您应该使用 MSAL 兑换代币,而不是 ADAL。
public async Task OnAuthorizationCodeReceived(AuthorizationCodeReceivedContext context) { var code = context.ProtocolMessage.Code; string signedInUserID = context.Principal.FindFirst(ClaimTypes.NameIdentifier).Value; TokenCache userTokenCache = new MSALSessionCache(signedInUserID, context.HttpContext).GetMsalCacheInstance(); ConfidentialClientApplication cca = new ConfidentialClientApplication(AzureAdB2COptions.ClientId, AzureAdB2COptions.Authority, AzureAdB2COptions.RedirectUri, new ClientCredential(AzureAdB2COptions.ClientSecret), userTokenCache, null); try { AuthenticationResult result = await cca.AcquireTokenByAuthorizationCodeAsync(code, AzureAdB2COptions.ApiScopes.Split(' ')); context.HandleCodeRedemption(result.AccessToken, result.IdToken); } catch (Exception ex) { //Handle } }