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 так что он ищет роли из базы данных для вас.

Другие вопросы по тегам