ASP.NET MVC - динамическая авторизация
Я строю простую CMS, в которой роли устанавливаются динамически в административной панели. Существующий способ авторизации метода контроллера, добавление [Authorize(Roles="admin")]
например, поэтому уже не достаточно. Отношения "роль-действие" должны храниться в базе данных, чтобы конечные пользователи могли легко предоставлять / принимать разрешения другим пользователям в панели администратора. Как я могу это реализовать?
3 ответа
Если вы хотите взять под контроль процесс авторизации, вы должны создать подкласс AuthorizeAttribute и переопределить метод AuthorizeCore. Тогда просто украсьте свои контроллеры с вашим CmsAuthorizeAttribute
вместо по умолчанию.
public class CmsAuthorizeAttribute : AuthorizeAttribute
{
public override virtual bool AuthorizeCore(HttpContextBase httpContext)
{
IPrincipal user = httpContext.User;
IIdentity identity = user.Identity;
if (!identity.IsAuthenticated) {
return false;
}
bool isAuthorized = true;
// TODO: perform custom authorization against the CMS
return isAuthorized;
}
}
Недостатком этого является то, что у вас не будет доступа к IoC, внедренному в ctor, поэтому вам придется запрашивать любые зависимости непосредственно из контейнера.
Это именно то, что делает членство / профиль ASP.NET для вас. И это работает с атрибутом Authorize.
Если вы хотите свернуть свой собственный, вы можете создать собственный фильтр действий, который имитирует поведение стандартного фильтра действий Авторизации. Псевдокод ниже.
public MyAuthorizeAttribute : ActionFilterAttribute
{
public string MyRole { get; set; }
public void OnActionExecuting(ControllerContext context)
{
if (!(bool)Session["userIsAuthenticated"])
{
throw new AuthenticationException("Must log in.");
}
if (!Session["userRoles"].Contains(MyRole))
{
throw new AuthenticationException("Must have role " + MyRole);
}
}
}
Отношение роль - действие должно храниться в базе данных
Вы должны будете проверить свою безопасность в методе контроллера, если вы не хотите подкласс AuthorizeAttribute
так что он ищет роли из базы данных для вас.