InvalidOperationException: AuthorizationPolicy с именем: 'Bearer' не найден

В настоящее время я пытаюсь узнать, как создать безопасный api с использованием токена-носителя, я все время получаю эту ошибку (InvalidOperationException: политика авторизации с именем: 'Bearer' не найдена.), И я не уверен, почему. Я использую asp.net-core 2.0 и пытаюсь использовать промежуточное ПО jwt auth. Вот мой стартап, любая помощь будет принята с благодарностью!

public class Startup
{
    public Startup(IConfiguration configuration)
    {
        Configuration = configuration;
    }

    const string TokenAudience = "ExampleAudience";
    const string TokenIssuer = "ExampleIssuer";
    private RsaSecurityKey key;
    private TokenAuthOptions tokenOptions;

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {

        var keyParams = RSAKeyUtils.GetRandomKey();
        key = new RsaSecurityKey(keyParams);

        tokenOptions = new TokenAuthOptions()
        {
            Audience = TokenAudience,
            Issuer = TokenIssuer,
            SigningCredentials = new SigningCredentials(key, SecurityAlgorithms.RsaSha256Signature)
        };

        services.AddDbContext<VulnerabilityContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddScoped<LoggingActionFilter>();
        services.AddScoped<VulnsService>();

        services.AddAuthentication(o =>
        {
            o.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            o.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer(o =>
        {
            o.Authority = "https://localhost:54302";
            o.Audience = tokenOptions.Audience;
            o.RequireHttpsMetadata = false;
        });

        services.AddMvc();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {

        //app.UseSession();
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
            app.UseBrowserLink();
        }
        else
        {
            app.UseExceptionHandler("/Home/Error");
        }

        app.UseAuthentication();

        app.UseStaticFiles();

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
}
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
10
0
10 424
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Вы получаете эту ошибку, потому что схемы аутентификации и политики авторизации - это не одно и то же. Посмотрим, что из себя представляет каждый из них.

Схемы аутентификации

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

В одном приложении можно настроить несколько схем аутентификации:

  • Вы можете аутентифицировать пользователей с помощью файлов cookie или аутентификации токенов-носителей JWT.
  • Вы даже можете принимать токены JWT из разных источников; в этом случае вам нужно будет дважды вызвать метод AddJwtBearer. Также важно отметить, что имя схемы аутентификации должно быть уникальным, поэтому вам нужно будет использовать перегрузка, которая принимает имя и делегат конфигурации параметров

Политики авторизации

Когда пользователь аутентифицируется в вашем приложении, это не означает, что он может получить доступ ко всем функциям в нем. У вас могут быть разные уровни доступа, где администраторы имеет особые права, которых никто другой не имеет; это выражается в ASP.NET Core с помощью политик авторизации. Я настоятельно рекомендую вам прочитать официальная документация по авторизации, поскольку я считаю его отличным.

Политика авторизации состоит из двух вещей:

  • уникальное имя
  • набор требований

Взяв пример администраторы, упомянутый выше, мы можем создать вымышленную политику авторизации:

  • Имя: Administrators
  • Требования: должен быть аутентифицирован и иметь претензию role со значением Administrators.

В коде это можно выразить так:

services.AddAuthorization(options =>
{
    options.AddPolicy("Administrators", new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .RequireClaim("role", "Administrators")
        .Build());
});

Затем вы можете применить эту политику к некоторым конкретным контроллерам или действиям в своем приложении, украсив их атрибутом [Authorize(Policy = "Administrators")]. Затем MVC во время запроса выполнит требования к текущему пользователю и определит, могут ли они получить доступ к конкретной функции.

Я предполагаю, что вы добавили такой атрибут в одно из своих действий / контроллеров, но вы не зарегистрировали имена политик авторизации Bearer в системе авторизации.

Если ваша цель - предотвратить доступ неаутентифицированных пользователей к некоторым действиям, вы можете применить атрибут [Authorize]. Это приведет к запуску политика по умолчанию, который по умолчанию требует только аутентификации пользователя.

Ответ принят как подходящий

Я не работаю с политиками, и эта ошибка произошла со мной, когда я забыл указать роли в атрибуте авторизации.

У меня было такое:

[Authorize("Administrator")] // if you don't specify the property name Roles it will consider it as the policy name

Исправлено, изменив его на:

[Authorize(Roles = "Administrator")]

Добавление AuthenticationSchemes в класс контроллера работает для меня:

[Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]

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