Настраиваемый атрибут авторизации ядра asp.net - PullRequest
0 голосов
/ 30 мая 2019

Я пытаюсь выяснить, как лучше всего создать собственный атрибут авторизации для моего основного приложения asp.net.Я видел этот пост, и я знаю о 2 подходах, обсуждаемых здесь. Как создать собственный атрибут AuthorizeAttribute в ASP.NET Core?

1) Использование IAuthorizationFilter

2) Использование политик

Я увидел, что официальныйДокумент предполагает, что мы должны использовать политики, а не IAuthorizationFilter, но я чувствовал, что использование политик для моего сценария является излишним.Мне лично больше понравился подход IAuthorizationFilter.

У меня есть очень основное требование.Я хочу создать атрибут авторизации для моего веб-API и должен выдать 403, если текущий пользователь не входит в белый список для использования этого API.Я действительно не забочусь об областях (canRead, canWrite, может readWrite и т. Д.).Если я продолжу подход политики, я могу использовать одну и ту же политику для всех моих API.Каков наилучший способ достичь этого?

1 Ответ

1 голос
/ 30 мая 2019

Использование политик для чего-то подобного не является чрезмерным Вам нужно требование:

public class WhitelistRequirement: IAuthorizationRequirement
{
}

Обработчик:

public class WhitelistHandler : AuthorizationHandler<WhitelistRequirement>
{

    // Implement a constructor to inject dependencies, such as your whitelist

    protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   WhitelistRequirement requirement)
    {
        if (isInWhitelist) // Your implementation here
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }
}

Зарегистрируйте оба в ConfigureServices:

services.AddAuthorization(options =>
            options.AddPolicy("WhitelistPolicy",
            b => b.AddRequirements(new WhitelistRequirement())));

services.AddSingleton<IAuthorizationHandler, WhitelistHandler>();

Тогда используйте вашу политику:

[Authorize(Policy = "WhitelistPolicy")]

Вы можете применить политику глобально с помощью глобального фильтра:

services.AddMvc(config =>
{
    var policy = new AuthorizationPolicyBuilder()
                     .AddRequirements(new WhitelistRequirement())
                     .Build();
    config.Filters.Add(new AuthorizeFilter(policy));
})

Результирующее поведение для неаутентифицированных или запрещенных пользователей зависит от реализации поведения «вызов» и «запрет» в обработчике аутентификации вашего приложения.

См. здесь .

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