Невозможно запустить приложение .net core 2.2 api: не была указана схема authenticationScheme, и не было найдено DefaultChallengeScheme - PullRequest
0 голосов
/ 12 марта 2019

Мы интегрируем Azure Active Directory с веб-приложением React, а бэкэнд будет .NET core 2.2 API.

Текущий статус: мы можем добавить регистрацию приложения для веб-приложения React в Azure AD. Благодаря этому мы смогли выполнить аутентификацию и получить токен Bearer после успешной аутентификации в реагирующем веб-приложении.

Проблемы, с которыми я сталкиваюсь: поскольку аутентификация выполнена, я бы хотел выполнить Авторизацию в базовом API Backend .net с использованием токена Bearer. Однако я не смог добиться успеха, так как я получаю следующую ошибку.

InvalidOperationException: не указана схема authenticationScheme, и не найден DefaultChallengeScheme. Может ли кто-нибудь помочь решить эту проблему?

Фрагмент кода из проекта .net core api:

в файле запуска: метод ConfigureServices (IServiceCollection services).

              services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

      services.AddAuthorization(options =>
        {
            options.AddPolicy("RequireAdministratorRole",
                policy =>
                {
                    policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
                    policy.AddRequirements(new AdminRequirement());
                    policy.RequireAuthenticatedUser();
                    policy.RequireRole("Admin");

                });
        });

  services.AddSingleton<IAuthorizationHandler, AdminHandler>();

В Configure (приложение IApplicationBuilder, среда IHostingEnvironment):

            if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseAuthentication();
        app.UseMvc();

и AuthenticationHandler:

    public class AdminHandler : AuthorizationHandler<AdminRequirement>, IAuthorizationRequirement
{
    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, AdminRequirement requirement)
    {
        //Check user claims for Role
        if (context.User.HasClaim(ClaimTypes.Role, "Admin"))
        {
            context.Succeed(requirement);
        }

        return Task.FromResult(0);
    }
}

1 Ответ

0 голосов
/ 12 марта 2019

Если вам нужно указать схему, возможно, из-за разного рода аутентификации вы должны добавить в метод Configure () этот код:

 app.Use(async (context, next) =>
        {
            IEnumerable<string> schemes = GetSchemesForRequest(context);
            foreach (string scheme in schemes)
            {
                AuthenticateResult result = await context.AuthenticateAsync(scheme);
                if (!result.Succeeded)
                    continue;

                context.User = result.Principal;
                break;
            }
            await next();
        });

Тогда в вашем методе:

IEnumerable<string> GetSchemesForRequest(HttpContext context)

Вы можете подумать, какова правильная схема для этого запроса.

...