. net атрибут авторизации ядра 3.0 с политикой, AuthenticationSchemes - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь реализовать две схемы аутентификации в моем приложении. В контроллере с атрибутом authorize я устанавливаю схему, которую контроллер должен использовать для аутентификации. регистрация auth:

Запуск:

 public class Startup
    {

        public void ConfigureServices(IServiceCollection services)
        {
            services.ConfigureAuthentication();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseAuthentication();
            app.UseAuthorization();
        }
    }

AuthenticationExtensions.cs:

public static class AuthenticationExtensions
{

public static IServiceCollection ConfigureAuthentication(this IServiceCollection services)
{
    services.AddAuthentication(AuthConstants.DefaultScheme)
        .AddScheme<AuthenticationSchemeOptions, DefaultSchemeHandler>(AuthConstants.DefaultScheme, AuthConstants.DefaultScheme, null)
        .AddScheme<AuthenticationSchemeOptions, IdentityAuthenticationHandler>(AuthConstants.IdentityScheme, AuthConstants.IdentityScheme, null);

    services.AddAuthorization(options =>
    {
        options.AddPolicy("IdentityAuthPolicy", policy =>
        {
            policy.AuthenticationSchemes.Add(AuthConstants.IdentityScheme);
            policy.RequireAuthenticatedUser();
        });
    });

    return services;
}

}

В контроллере я определяю, какие схемы аутентификации use:

[Authorize(AuthenticationSchemes = AuthConstants.IdentityScheme)]
[ApiController]
[Route("[controller]")]
public class UsersController : ControllerBase
{}

Проблема: приложение пытается выполнить аутентификацию по схеме по умолчанию после сбоя, пробует ту, которая указана в атрибуте authorize. Я хочу, чтобы приложение использовало единственную схему аутентификации, которую я определил в атрибуте authorize. Кроме того, я пытался использовать политику, но результат был тот же.

1 Ответ

0 голосов
/ 10 апреля 2020

Вы должны:

  1. Добавить службу контроллеров

  2. Настроить маршрутизацию, добавив связующее ПО, связанное с маршрутизацией

  3. Сначала зарегистрируйте связующее ПО авторизации, позвонив app.UseAuthorization() до app.UseAuthentication()

Вот как должен выглядеть ваш код класса Startup:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(AuthConstants.DefaultScheme)
        .AddScheme<AuthenticationSchemeOptions, DefaultSchemeHandler>(AuthConstants.DefaultScheme, AuthConstants.DefaultScheme, null)
        .AddScheme<AuthenticationSchemeOptions, IdentityAuthenticationHandler>(AuthConstants.IdentityScheme, AuthConstants.IdentityScheme, null);

    services.AddAuthorization(options =>
    {
        options.AddPolicy("IdentityAuthPolicy", policy =>
        {
            policy.AuthenticationSchemes.Add(AuthConstants.IdentityScheme);
            policy.RequireAuthenticatedUser();
        });
    });

    services.AddControllers();
}

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

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

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

Впоследствии либо используйте свойство AuthenticationSchemes атрибута [Authorize], либо его свойство Policy:

[Authorize(AuthenticationSchemes = AuthConstants.IdentityScheme)]
//[Authorize(Policy = "IdentityAuthPolicy")]
[ApiController]
[Route("[controller]")]
public class UsersController : ControllerBase
{
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...