Asp.Net Core 2.0 и Azure AD B2C для аутентификации в WebApp и API

У меня есть небольшое приложение, которое я использую для тестирования, оно находится в Asp.Net Core 1.1 как для веб-приложения, так и для API, проверка подлинности выполняется с помощью Azure AD B2C. Я пытаюсь переместить его на .Net Core 2.0, но не могу понять, как заставить его работать. Я попытался использовать оба образца из GitHub Azure-Samples для веб-приложения и API, но при попытке получить несанкционированную ошибку или ошибку 500 для доступа к api, если у вас есть рабочий пример вызова веб-api из веб-приложения, использующего 2.0 и защищенного AD B2C, мы будем очень признательны.

Изменить: Я использую для тестирования следующие образцы: Веб-приложение: WebApp-OpenIDConnect-DotNet core2.0 Web Api: B2C-WebApi core2.0, я изменил значения параметров приложения, чтобы они соответствовали моему каталогу b2c.

Для моего тестового приложения asp.net core 1.1 я использую те же образцы, что и выше, но из основной ветки с тем же значением для appsettings.

Редактировать 2 по умолчанию, в startup.cs у меня есть это:

        services.AddAuthentication()
            .AddJwtBearer(option => new JwtBearerOptions
            {
                Authority = string.Format("https://login.microsoftonline.com/tfp/{0}/{1}/v2.0/",
                Configuration["Authentication:AzureAd:Tenant"], Configuration["Authentication:AzureAd:Policy"]),
                Audience = Configuration["Authentication:AzureAd:ClientId"],
                Events = new JwtBearerEvents
                {
                    OnAuthenticationFailed = AuthenticationFailed
                }
            });

что дает мне следующую ошибку:

Microsoft.AspNetCore.Hosting.Internal.WebHost: Информация: запрос запуска HTTP / 1.1 GET http://localhost:44352/api/values/5
Microsoft.AspNetCore.Server.Kestrel: ошибка: идентификатор подключения «0HL89JHF4VBLM», идентификатор запроса «0HL89JHF4VBLM: 00000001»: приложение сгенерировало необработанное исключение. System.InvalidOperationException: не была указана схема проверки подлинности, и схема DefaultChallengeScheme не найдена.

если изменены services.AddAuthentication как то

        services.AddAuthentication(sharedOption =>
        {
            sharedOption.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
        })

ошибка сейчас

Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler: информация: не удалось проверить токен xxx. Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException: IDX10500: ошибка проверки подписи. Ключи безопасности для проверки подписи предоставлены не были. на System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature (String знак, TokenValidationParameters validationParameters) в System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken (String знак, TokenValidationParameters validationParameters, SecurityToken & validatedToken) в Microsoft.AspNetCore.Authentication.JwtBearer. JwtBearerHandler.d__6.MoveNext ()


person JP Gutton    schedule 01.10.2017    source источник
comment
Этой информации недостаточно, чтобы помочь вам. Можете ли вы добавить ссылки на образцы, которые вы используете, код, который вы используете, HTTP-запросы и полезные данные токенов?   -  person Saca    schedule 01.10.2017
comment
@Saca, я отредактировал вопрос, чтобы добавить ссылки и дополнительную информацию, кроме настроек приложения, которые я не внес и не внес никаких изменений   -  person JP Gutton    schedule 01.10.2017
comment
Он работает, если App и Api имеют .net core 1.1 или если App - 2.0, а Api - 1.1. Это не работает, если App и Api - 2.0 или если App - 1.1, а Api - 2.0   -  person JP Gutton    schedule 02.10.2017


Ответы (2)


Я видел запрос на перенос в образце, который исправляет эту проблему (Link) необходимо изменить services.AddAuthentication на:

        services.AddAuthentication(options =>
          {
            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
                          })
            .AddJwtBearer(jwtOptions =>
            {
            jwtOptions.Authority = $"https://login.microsoftonline.com/tfp/{Configuration["Authentication:AzureAd:Tenant"]}/{Configuration["Authentication:AzureAd:Policy"]}/v2.0/";
            jwtOptions.Audience = Configuration["Authentication:AzureAd:ClientId"];
            jwtOptions.Events = new JwtBearerEvents
                              {
                OnAuthenticationFailed = AuthenticationFailed
                                  };
            });
person JP Gutton    schedule 05.10.2017

Я получил этот пример, работающий как для Core 1.1, так и для Core 2.0, добавьте, пожалуйста, проверку подлинности Oath, как показано ниже,

services.AddAuthentication(sharedOptions =>
            {
                sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
                sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
            })
            .AddAzureAdB2C(options => Configuration.Bind("Authentication:AzureAdB2C", options))

Параметры конфигурации будут определены внутри класса AzureAdB2CAuthenticationBuilderExtensions, который находится внутри проект azure b2c

Похоже, ваш токен не обновляется из Azure, можете ли вы получить токен из своего веб-приложения? не могли бы вы убедиться, что вы не получаете null

Вы зарегистрировали свои области API в веб-приложении клиента Azure b2c? "ApiScopes": "https://fabrikamb2c.onmicrosoft.com/demoapi/demo.read "

вам необходимо установить область действия в своем веб-API и разрешить чтение в веб-приложении, нажмите ссылка, чтобы настроить его

person jeer65    schedule 22.12.2017