将 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" AuthenticationContexthttps://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
        }
    }