У нас есть веб-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));
Но ни один из них не работает. Как нам добиться этого?


Вам не нужно выполнять настройку для обоих, как вы делаете выше.
Вам просто нужно настроить B2C в коде, а после этого вам нужно использовать настраиваемые политики в Azure B2C. Вам необходимо определить Azure AD как поставщика утверждений, с которым Azure B2C может взаимодействовать через конечную точку. Это позволит пользователям входить в систему с помощью Azure AD или социальной учетной записи.
Найдите подробную ссылку здесь, в документах Майкрософт.
Другой вариант, который я мог бы придумать, — это зарегистрировать приложение как мультитенантное, что позволяет приложению аутентифицировать пользователя из другого AD, у которого есть разрешение. Ссылка: github.com/Azure-Samples/…
Я тоже столкнулся с подобной проблемой и добился пользовательской политики. Ниже приведен код аутентификации.
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
К сожалению, я работаю с сильно настроенным клиентом, предоставленным B2C, который мы не можем изменить. Есть ли способ добиться этого в коде?