Как реализовать управление доступом на основе разрешений с помощью Asp.Net Core

Я пытаюсь реализовать контроль доступа на основе разрешений с ядром Aspnet. Для динамического управления ролями и разрешениями пользователей (create_product, delete_product и т. Д.) Они хранятся в базе данных. Модель данных похожаhttp://i.stack.imgur.com/CHMPE.png

До ядра aspnet (в MVC 5) я использовал кастомAuthorizeAttribute как ниже, чтобы решить проблему:

public class CustomAuthorizeAttribute : AuthorizeAttribute
{
    private readonly string _permissionName { get; set; }
    [Inject]
    public IAccessControlService _accessControlService { get; set; }

    public CustomAuthorizeAttribute(string permissionName = "")
    {
        _permissionName = permissionName;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        base.OnAuthorization(filterContext);
        var user = _accessControlService.GetUser();
        if (PermissionName != "" && !user.HasPermission(_permissionName))
        {
            // set error result
            filterContext.HttpContext.Response.StatusCode = 403;
            return;
        }
        filterContext.HttpContext.Items["CUSTOM_USER"] = user;
    }
}

Затем я использовал его в методе действия, как показано ниже:

[HttpGet]
[CustomAuthorize(PermissionEnum.PERSON_LIST)]
public ActionResult Index(PersonListQuery query){ }

Кроме того, я использовал HttpContext.Items ["CUSTOM_USER"] в представлениях, чтобы показать или скрыть часть HTML:

@if (CurrentUser.HasPermission("<Permission Name>"))
{

}

Когда я решил переключить ядро ​​aspnet, весь мой план провалился. Потому что не было виртуальногоOnAuthorization метод вAuthorizeAttribute, Я попробовал несколько способов решить проблему. Это ниже:

Использование новой авторизации на основе политик (я думаю, что это не подходит для моего сценария)

Использование пользовательскихAuthorizeAttribute а такжеAuthorizationFilter(я прочитал этот постhttps://stackoverflow.com/a/35863514/5426333 но я не мог изменить это должным образом)

Использование пользовательского промежуточного программного обеспечения (как получитьAuthorizeAttribute текущего действия?)

Использование ActionFilter (это правильно в целях безопасности?)

Я не мог решить, какой путь лучше всего подходит для моего сценария и как его реализовать.

Первый вопрос: Реализация MVC5 плохая практика?

Второй вопрос: Есть ли у вас какие-либо предложения по внедрению ядра aspnet?

Ответы на вопрос(2)

Ваш ответ на вопрос