asp.net MVC Контроллеры и аутентификация - PullRequest
2 голосов
/ 06 марта 2012

У меня есть куча контроллеров и связанных представлений, к которым должна применяться аутентификация на основе ролей.Я имею в виду наличие базового контроллера с определением свойства [authorize], чтобы все контроллеры, которые наследуются от этого базового класса, были доступны только после входа в систему.Я проверил это, чтобы работать.Я не уверен, является ли это наилучшей практикой или будут ли какие-либо провалы в этом подходе.

В будущем мне нужно будет, чтобы определенные страницы были доступны только пользователям с определенной ролью.Список ролей будет из таблицы базы данных.поэтому вместо того, чтобы менять все связанные контроллеры, я просто делаю это изменение в базовом контроллере, от которого он наследуется.Это правильный способ сделать это?

Спасибо за ваше время.

Ответы [ 2 ]

7 голосов
/ 06 марта 2012

Вы можете объединить любое количество атрибутов Authorize.

т.е. Вы можете иметь атрибут Authorize на вашем базовом контроллере и более конкретный атрибут на другом контроллере (например, указание роли) и наиболее специфичный атрибут действия контроллера (указание роли или пользователя).)

[Authorize]
public class BaseController : Controller
{}

[Authorize(Roles="Administrator")]
public class AdminController : BaseController
{
    [Authorize(Roles="SuperUser")]
    public ActionResult SuperSecret()
    {}
}

Он проверит все атрибуты и отменит доступ только в случае сбоя любого из атрибутов.

В будущем мне потребуется, чтобы определенные страницы были доступны только пользователямв определенной роли.

Так работает аутентификация на основе ролей.

Список ролей будет взят из таблицы базы данных.

Загрузите роли в пользовательский IPrincipal в методе OnPostAuthenticate в global.asax.

, поэтому вместо изменения всех связанных контроллеров я просто делаю этоизменить базовый контроллер, от которого он наследуется.

Я не следую за вами по этому требованию.Вы хотите избежать указания ролей на своих контроллерах?

1 голос
/ 06 марта 2012

Можно использовать базовый класс контроллеров для своих контроллеров.

Однако я не думаю, что вам следует связывать наследование ваших контроллеров с иерархией ролей.Мне это не кажется чистым.

Я бы реализовал дерево наследования атрибутов, например:

class NormalUserRolesAttribute: AuthorizeAttribute
class AdvancedUserRolesAttribute: AuthorizeAttribute
class AdminUserRolesAttribute: AuthorizeAttribute

с немного другим поведением OnAuthorization, а затем пометил бы ваши контроллеры такимиатрибуты.

...