RequireAuthorization () для конечных точек .MapControllerRoute () не работает, и каждый запрос проходит через - PullRequest
0 голосов
/ 13 марта 2020

У меня есть следующий код в Asp. Net Core 3.1

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options =>
        {
            options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
            options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        }).AddJwtBearer();
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
    app.UseRouting();

    app.UseCors(DefaultCorsPolicyName);

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

    app.UseEndpoints(endpoints =>
    {
    endpoints.MapControllerRoute("default", "{controller}/{action}/{id?}").RequireAuthorization(new AuthorizeAttribute());
    });
}


[ApiController]
[Route("[controller]/[action]")]
public class TestController : ControllerBase
{
    [HttpGet]
    public string Test()
    {
        return "Test works!";
    }
}

, но все запросы проходят и авторизация не работает. Есть идеи, почему это происходит?

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Меня тоже укусило, у меня был такой код:

services.AddAuthorization(options =>
  {
     options.DefaultPolicy = new AuthorizationPolicyBuilder()
        .RequireAuthenticatedUser()
        .AddRequirements(new MustBeSuperAdminRequirement())
        .Build();
  })

Можно было бы подумать, что MustBeSuperAdminRequirement не будет вызван, если пользователь не вошел в систему ... но это не так ! ... все шло как по маслу, и я потратил несколько часов, почесывая голову ...

В качестве обходного пути я сделал это:

public static IMvcBuilder ConfigureMvc(this IServiceCollection services)
{
  services
    .AddAuthorization(options =>
     {
        options.DefaultPolicy = new AuthorizationPolicyBuilder()
        //.RequireAuthenticatedUser()  //<-- this does not seems to do anything, refer: https://github.com/dotnet/aspnetcore/issues/4656#issuecomment-605012014
        .AddRequirements(new MustBePtwUserRequirement())
        .Build();
     })
protected override async Task HandleRequirementAsync(
            AuthorizationHandlerContext context,
            MustBeSuperAdminRequirement requirement)
{
    var principal = context.User;
    if (!principal.IsAuthenticated())
    {
        return;  //user not logged in
    }

   //the rest of the codes
}

.. а здесь ...

app.UseEndpoints(endpoints => 
{
    endpoints.MapControllers().RequireAuthorization();
});
0 голосов
/ 13 марта 2020

Добавьте endpoints.MapControllers().RequireAuthorization(...); в конфигурацию конечной точки.

Ваш контроллер имеет собственный / явный атрибут Route и не покрывается вызовом MapControllerRoute.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...