Проверка подлинности ASP.Net Core с помощью AAD и B2C

У нас есть веб-API, написанный на ASP.Net Core 2.2, и мы хотим аутентифицировать пользователей с помощью AAD или B2C. Это означает, что у нас есть некоторые конечные точки, к которым могут получить доступ только пользователи AAD, другие — пользователи B2C, а некоторые — и те, и другие.

В Startup.cs у нас есть

services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme)
   .AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
   AddAzureADBearer(options => Configuration.Bind("AzureAd", options));

По отдельности они работают, но когда мы пытаемся добавить конфигурацию для обоих одновременно, ни один из них не работает.

я тоже пробовал

services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
   .AddAzureADBearer(options => Configuration.Bind("AzureAd", options))
   .AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));

Но ни один из них не работает. Как нам добиться этого?

Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
4
0
2 043
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужно выполнять настройку для обоих, как вы делаете выше.

Вам просто нужно настроить B2C в коде, а после этого вам нужно использовать настраиваемые политики в Azure B2C. Вам необходимо определить Azure AD как поставщика утверждений, с которым Azure B2C может взаимодействовать через конечную точку. Это позволит пользователям входить в систему с помощью Azure AD или социальной учетной записи.

Найдите подробную ссылку здесь, в документах Майкрософт.

К сожалению, я работаю с сильно настроенным клиентом, предоставленным B2C, который мы не можем изменить. Есть ли способ добиться этого в коде?

Colin Desmond 26.04.2019 11:26

Другой вариант, который я мог бы придумать, — это зарегистрировать приложение как мультитенантное, что позволяет приложению аутентифицировать пользователя из другого AD, у которого есть разрешение. Ссылка: github.com/Azure-Samples/…

gunvant.k 26.04.2019 22:58
Ответ принят как подходящий

Я тоже столкнулся с подобной проблемой и добился пользовательской политики. Ниже приведен код аутентификации.

public static void AddAuthorization(this IServiceCollection services, IConfigurationRoot configuration)
    {
        services.AddAuthentication()
            .AddJwtBearer("AAD", options =>
            {
                options.MetadataAddress = configuration["AzureAd:Instance"] + configuration["AzureAd:TenantId"] +
                                          "/v2.0/.well-known/openid-configuration";
                options.Authority = configuration["AzureAd:Instance"] + configuration["AzureAd:TenantId"];
                options.Audience = configuration["AzureAd:ClientId"];
                options.TokenValidationParameters =
                    new TokenValidationParameters
                    {
                        ValidIssuer = $"https://sts.windows.net/{configuration["AzureAd:TenantId"]}/",
                    };
                options.Events = new JwtBearerEvents
                {
                    OnMessageReceived = context => Task.CompletedTask,
                    OnChallenge = context => Task.CompletedTask,
                    OnAuthenticationFailed = (context) =>
                    {
                        Console.WriteLine("OnAuthenticationFailed: " + context.Exception.Message);
                        return Task.CompletedTask;
                    },
                    OnTokenValidated = context =>
                    {
                        Console.WriteLine("Validated: " + context.SecurityToken);
                        return Task.CompletedTask;
                    }
                };
            })
            .AddJwtBearer("B2C", options =>
        {
            options.Authority = configuration["AzureAdB2C:Instance"] + configuration["AzureAdB2C:Domain"] + "/" + configuration["AzureAdB2C:SignUpSignInPolicyId"] + "/v2.0";
            options.Audience = configuration["AzureAdB2C:ClientId"];

            options.Events = new JwtBearerEvents
            {
                OnMessageReceived = context => Task.CompletedTask,
                OnChallenge = context => Task.CompletedTask,
                OnAuthenticationFailed = (context) =>
                {
                    Console.WriteLine("OnAuthenticationFailed: " + context.Exception.Message);
                    return Task.CompletedTask;
                },
                OnTokenValidated = context =>
                {
                    Console.WriteLine("Validated: " + context.SecurityToken);
                    return Task.CompletedTask;
                }
            };
        });
        services
            .AddAuthorization(options =>
            {
                options.AddPolicy("AADUsers", new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .AddAuthenticationSchemes("AAD")
                    .Build());

                options.AddPolicy("B2CUsers", new AuthorizationPolicyBuilder()
                    .RequireAuthenticatedUser()
                    .AddAuthenticationSchemes("B2C")
                    .Build());
            });
    }

В файле startup.cs добавьте приведенный ниже код в ConfigureServices.

services.AddAuthorization(Configuration);

Теперь в вашем контроллере вы можете оформить вот так на основе AD или B2CAD

[Authorize(Policy = "B2CUsers")] // For B2C authentication
[Authorize(Policy = "AADUsers")] // For AAD authentication

Другие вопросы по теме