В моем веб-приложении есть настраиваемая система ролей, но я бы хотел скрыть некоторые вещи на веб-сайте
В текущем подходе я отправляю в View что-то вроде этого:
@If(ViewData["isAbleTo___"].ToString() == true.ToString())
{
<div>secret</div>
}
Но я бы не стал делать это каждый раз
в каждом методе контроллера для каждого контроллера
Решение:
public class ControllerBase : Controller
{
protected Context _dbcontext;
public ControllerBase()
{
}
public override void OnActionExecuting(ActionExecutingContext context)
{
ViewData[""] = _dbcontext.....
}
}
public class MyController : ControllerBase
{
public HomeController(Context dbcontext)
{
_dbcontext = dbcontext
}
}
Это неправильный подход с самого начала. Разрешения должны обрабатываться через роли или политика. Например, вместо того, чтобы устанавливать ключ в ViewData
, чтобы сказать, что пользователь может делать A, пользователю должна быть назначена роль, подобная CanA
. Тогда вы можете просто проверить User.IsInRole('CanA')
.
Или, если вам нужно больше логики для принятия решения, вы можете создать обработчик политики, а затем проверьте, проходит ли пользователь эту политику:
@using Microsoft.AspNetCore.Authorization
@inject IAuthorizationService AuthorizationService
...
@if ((await AuthorizationService.AuthorizeAsync(User, "CanA")).Succeeded)
{
// Show `A` stuff
}