Я пытаюсь реализовать управление доступом на основе разрешений с ядром 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, весь мой план был неудачным. Поскольку в AuthorizeAttribute
не было виртуального метода OnAuthorization
. Я попробовал несколько способов решить проблему. Это ниже:
-
Использование новой авторизации на основе политик (я думаю, что она не подходит для мой scenerio)
-
Использование пользовательских
AuthorizeAttribute
иAuthorizationFilter
(я прочитал это post qaru.site/info/334516/..., но я не смог его правильно изменить) -
Использование специального промежуточного программного обеспечения (как получить
AuthorizeAttribute
текущего действие?) -
Использование ActionFilter (правильно ли это для целей безопасности?)
Я не мог решить, какой путь лучше всего подходит для моего scenerio и как его реализовать.
Первый вопрос: Неверная практика внедрения MVC5?
Второй вопрос: Есть ли у вас предложение реализовать ядро aspnet?