Ресурсная авторизация списка ASP. Net Core - PullRequest
0 голосов
/ 03 апреля 2020

Я читал статью Microsoft о ресурсной авторизации с помощью IAuthorizatinService, но она позволяет авторизовать только один ресурс. Например, у меня есть класс User и класс File. Файл имеет владельца и может быть опубликован c или нет, поэтому файл можно просмотреть, только если он опубликован c или пользователь является владельцем этого файла. Мне нужно отобразить список всех файлов для разных пользователей, поэтому каждый пользователь увидит все файлы publi c и все принадлежащие им файлы. В обработчике авторизации у меня есть это:

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context,
                                                   OwnerOrPublicRequirement requirement,
                                                   File resource)
    {
        if (resource.IsPublic || context.User.Identity?.Name == resource.Owner)
        {
            context.Succeed(requirement);
        }

        return Task.CompletedTask;
    }

Затем в контроллере я должен был сделать так:

List<File> authorizedFiles = new List<File>();
                    foreach (var file in _dbContext.Files)
                    {
                        var result = await _authorizationService
                            .AuthorizeAsync(User, file, new OwnerOrPublicRequirement());
                        if (result.Success)
                        {
                            authorizedFiles.Add(file);
                        }
                    }

Но это выглядит ужасно, потому что мне нужно загрузить все файлы из БД и затем отфильтруйте их один за другим. Что делать, если у меня есть миллионы файлов, и большинство из них не являются ни publi c, которые принадлежат пользователю? Я не смогу загрузить их все и отфильтровать, как это из-за нехватки памяти. Я могу переписать его в запрос LINQ, и пусть БД выполнит всю работу:

var authorizedFiles = _dbContext.Files
                        .Select(f => f)
                        .Where(f.IsPublic || f.User.Identity?.Name == f.Owner)
                        .ToList();

Но тогда у меня будет два места с кодом, который делает то же самое, поэтому всякий раз, когда мне нужно изменить логи авторизации c Я должен исправить две разные части кода. Так каков будет лучший способ сделать это?

1 Ответ

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

Не используйте пользовательский поставщик авторизации, слишком много дополнительных затрат и сложности.

Есть одно место, чтобы получить список файлов и позволить базе данных выполнять тяжелую работу по фильтрации и сортировке по имени файла.

Смерть от тысячи сокращений, связанных с необходимостью знать десятки / сотни особенностей фреймворка ASP. NET. Каждый элемент специальных знаний стоит минут в год для поддержки вас и будущих разработчиков и увеличивает риск проекта.

В сочетании с необходимостью использования сотен небольших дополнительных функций / специальных знаний, человеко-дни (месяцы?) Добавляются стоимость поддержки вашей производственной системы и ее совершенствования. Похоже, Microsoft забыла о том, что все очень просто, и добавляет каждую десятку необходимых функций, необходимых для специальных знаний, в каждую новую версию ASP. NET.

. Разработчик должен иметь возможность прочитать основную программу приложения, а затем отследить как вызывается каждый фрагмент кода во всей кодовой базе приложения, не требуя знания микробиологии ада внутренних / расширяемых возможностей ASP. NET framework.

...