AuthorizeAttribute не работает с маршрутизацией конечной точки в ASP. NET Core 3.1 - PullRequest
0 голосов
/ 25 февраля 2020

Я перенес свое ASP. NET Базовое приложение с версии 2.2 на 3.1. У меня есть контроллер с атрибутом [Authorize], например:

[ApiController]
[Authorize(policy: "MyPolicy")]
[Route("api/v{version:apiVersion}/[controller]")]
public class MyController : Controller

И политика определяется в Startup.cs следующим образом:

services.AddAuthorization(options =>
{
    options.AddPolicy("MyPolicy",
        policy =>
        {
            policy.RequireRole("MyRole");
            policy.RequireScope("my-scope");
        }
    );
});

В 2.2 все работало нормально, но после при переходе на 3.1 и включении маршрутизации конечной точки этот контроллер начал отклонять запросы к любой конечной точке, когда присутствует атрибут [Authorize], независимо от правил политики (перенаправление на страницу входа в систему). Когда я удаляю [Authorize] и смотрю на User.Claims, я вижу, что у него есть требуемые претензии (то есть scope: my-scope, role: MyRole). Это происходит, только если включена маршрутизация конечной точки, в случае использования UseMvc все работает правильно. Что не так с авторизацией в режиме маршрутизации конечной точки?

UPD: Configure метод выглядит следующим образом:

public void Configure(IApplicationBuilder app)
{
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseIdentityServer();
    app.UseRouting();

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

    app.UseEndpoints(endpoints => {
        endpoints.MapControllerRoute("default", "{controller=Home}/{action=Index}/{id?}");
        endpoints.MapControllers();
        endpoints.MapRazorPages();
    });
}

1 Ответ

0 голосов
/ 26 февраля 2020

Работает после явной настройки схемы аутентификации в определении политики:

services.AddAuthorization(options =>
{
    options.AddPolicy("MyPolicy",
        policy =>
        {
            policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme);
            policy.RequireRole("MyRole");
            policy.RequireScope("my-scope");
        }
    );
});
...