Доступ к API неавторизован, если не указан AuthenticationScheme - PullRequest
0 голосов
/ 26 мая 2020

Я изучаю Asp. Net Core Identity вместе с Identity Server 4. Пока мой пользователь аутентифицирован по IdS4, затем я могу получить токен для доступа к моему API, это все работает, как ожидалось, однако мне всегда нужно создавать свои атрибуты авторизации на моем контроллере API с указанным параметром AuthenticationScheme, даже если я указываю его своим API Config.cs (согласно нескольким источникам / руководствам, которые я прочитал).

Это мой API Config.cs, различные попытки я оставил закомментированными. Каждая версия не имеет никакого эффекта, иногда ошибка 500 вместо 401, но это будет из-за того, что я буду делать что-то очень неправильное!

Config.cs

public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<ApplicationCoreDbContext>(opt => opt.UseInMemoryDatabase("TestItem"));

    services
        .AddMvc();

    services
        //.AddAuthentication(cfg =>
        //{
        //    cfg.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        //    cfg.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        //})
        .AddAuthentication(IdentityServerAuthenticationDefaults.AuthenticationScheme)
        //.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddIdentityServerAuthentication(options =>
        {
            options.Authority = "https://localhost:5001";
            options.RequireHttpsMetadata = false;
            options.ApiName = "web_api";
            options.EnableCaching = true;
            options.CacheDuration = TimeSpan.FromMinutes(10);
        });
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
       app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthorization();

    app.UseAuthentication();
        
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

Вот образец конечной точки из моего контроллера API. В текущем состоянии он работает нормально, однако я считаю, что мне не нужно указывать AuthenticationSchemes, но если я удалю его, я всегда получаю ошибку 401. Есть ли у кого-нибудь предложения по поводу того, что мне не хватает?

API-контроллер

// GET: api/TestItems
[HttpGet]
//[Authorize]
[Authorize(AuthenticationSchemes = "Bearer")]
public async Task<ActionResult<IEnumerable<TestItemDto>>> GetTestItems()
{
    //SNIP
}

1 Ответ

2 голосов
/ 27 мая 2020

Проблема связана с порядком добавления промежуточного программного обеспечения в методе Startup.Configure. Правильный порядок имеет решающее значение для безопасности. Подробнее здесь . В этом случае вы перемещаете app.UseAuthorization() после app.UseAuthentication(). Код будет примерно таким:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
       app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();

    app.UseRouting();

    app.UseAuthentication();
    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}
...