Как реализовать управление доступом на основе разрешений с помощью 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?