Предыдущий ролик Следующий ролик  

Видео урок: Using role-based authorization

Основы ASP.NET MVC 5

В этом видео мы настроим некую функциональность уровня администратора и для управления доступом к ней создадим фильтры авторизации на основе ролей. В нашем CheckingAccountController мы еще не применяли никаких фильтров безопасности. Не забывайте, что на уровне контроллеров можно применить фильтр авторизации в виде атрибута Authorized, в соответствии с которым выполнять какое-либо действие в этом контроллере может только авторизованный пользователь. Пока что наше единственное действие просто отображает подробную информацию о фиктивном счете.

Давайте изменим его таким образом, чтобы оно отображало подробную информацию о счете авторизованного пользователя. Через некоторое время мы добавим сюда еще один метод, поэтому давайте объявим приватный ApplicationDbContext, который можно будет использовать в любом методе. В действии Details есть оператор Return, но давайте получим текущий счет из базы данных. Сначала вытащим ID авторизованного пользователя. И если вы его вытащили, но оно оказалось не валидным, убедитесь, что вы используете пространство имен Microsoft.AspNet.Identity.

Затем взамен возврата фиктивного счета можно отфильтровать существующую базу CheckingAccounts с помощью метода Where. Будем фильтровать по ApplicationUserId и возьмем первый из полученных результатов. Итак, теперь пользователь не сможет изменять ID текущего счета, для того чтобы просматривать подробную информацию обо всех счетах. Но давайте представим, что нам необходимо другое действие для пользователя с правами администратора, чтобы он мог просматривать баланс любого счета, передавая ID этого счета.

Чтобы такие пользователи могли быстро получать доступ к любому счету, создадим представление, в котором перечисляются все существующие счета, возвращаемые действием, которое мы назовем List. Итак, это действие будет возвращать представление и мы передадим в него все текущие счета системы с помощью db.CheckingAccounts.ToList. Нажмем правой кнопкой мыши на методе List и выберем пункт "Добавить представление". Затем выберем шаблон List и CheckingAccount в качестве модели.

Библиотеки скриптов нам не нужны, поскольку это представление будет статическим. И обратите внимание, что теперь при создании директивы model мы видим не один CheckingAccount, а их коллекцию - IEnumerable. А вместо отображения свойств одной модели он теперь использует цикл foreach, который отображает подробную информацию обо всех счетах. Не забывайте, что действие Details, на которое здесь приведена ссылка, демонстрирует только счет текущего пользователя, даже если мы передадим checkingAccountId, который в этом случае будет проигнорирован. Нам нужно создать новое действие. Назовем его DetailsForAdmin. И теперь в контроллере просто скопируем действие Details. Переименуем его в DetailsForAdmin. Пусть оно принимает параметр id типа integer, определяющий текущий счет. Можно получить этот текущий счет, просто вызвав метод Find для db.CheckingAccounts.

А еще мы явно передадим имя представления - "Details". Мы можем повторно использовать это представление, вместо того чтобы создавать совершенно новое под названием "DetailsForAdmin". Кроме того, мы выделим это действие и действие List с помощью атрибута Authorized и предположим, что доступом к ним обладают только пользователи с ролью администратора. Итак, нам придется еще создать роль администратора. В следующем видео мы создадим такую роль и назначим ее пользователю Администратору.