Аутентификация с пользовательской реализацией IAuthorizationPolicyProvider в do tnet core 3.1 - PullRequest
0 голосов
/ 03 мая 2020

Я реализовал пользовательский IAuthorizationPolicyProvider, следуя предоставленной документации здесь , но когда я отлаживаю и обращаюсь к обработчику и смотрю на объект context.User, я вижу, что такие свойства, как IsAuthenticated или context.User. IsInRole имеют значение false / empty. Мое приложение настроено с авторизацией токена jwt, и я подтвердил, что токен действительно содержит значения в данных полезной нагрузки ролей, но, похоже, он не аутентифицируется до того, как он достигает обработчика, чтобы я мог использовать эти значения. Может ли кто-нибудь помочь мне понять порядок операций или как я могу пройти проверку подлинности на самом деле?

У меня есть и аутентификация, и авторизация в моем Startup.cs:

services.AddAuthentication(sharedOptions =>
{
    sharedOptions.DefaultScheme = JwtBearerDefaults.AuthenticationScheme;
})

services.AddAuthorization(options =>
{
    var defaultAuthorizationBuilder = new AuthorizationPolicyBuilder("Bearer");
    defaultAuthorizationBuilder = defaultAuthorizationBuilder.RequireAuthenticatedUser();
    options.DefaultPolicy = defaultAuthorizationBuilder.Build();
}

services.AddSingleton<IAuthorizationPolicyProvider, MyCustomPolicyProvider>();
services.AddSingleton<IAuthorizationHandler, MyCustomHandler>();

1 Ответ

0 голосов
/ 07 мая 2020

После долгих раздумий я хочу поделиться тем, что я узнал, и ответить на этот вопрос, а также на более широкий вопрос о том, как работает реализация настраиваемого поставщика политик. При использовании AddAuthentication и AddAuthorization в Startup.cs это служит настройкой политики, которая будет использоваться при настройке поставщика политики авторизации по умолчанию, например, так:

public YourAuthorizationPolicyProvider(IOptions<AuthorizationOptions> options)
{
    this.BackupPolicyProvider = new DefaultAuthorizationPolicyProvider(options);
}

Для меня я использую этот резервный провайдер политики по умолчанию:

public Task<AuthorizationPolicy> GetDefaultPolicyAsync()
{
    return this.BackupPolicyProvider.GetDefaultPolicyAsync(); //this is the default policy established in Startup.cs
}

(Примечание: что-то, что я нашел сбивающим с толку и не очень много ясной документации по: DefaultPolicy против FallbackPolicy, особенно потому, что кажется, что на момент написания этого, GetFallbackPolicyAsyn c недавно стал методом, который требует реализации при реализации IAuthorizationPolicyProvider. DefaultPolicy: при применении атрибута [Authorize] используется эта политика. Когда предоставляется политика no , то GetFallbackPolicyAsyn c называется.)

Чего мне не хватало при создании пользовательских политик, указывало в AuthorizationPolicyBuilder, какую схему аутентификации я бы хотел использовать для этой политики. Теперь я понимаю, что это в документах, но это не вызвано специально, поэтому я пропустил это:

public Task<AuthorizationPolicy> GetPolicyAsync(string policyName)
{
    if (//some check on your policy name)
    {
        var policy = new AuthorizationPolicyBuilder(//what scheme to use for authentication);
        // your requirements
        return Task.FromResult(policy.Build());
    }
}
...