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

Видео урок: ASP.NET identity and the user manager

Основы ASP.NET MVC 5

В этом видео мы подробнее рассмотрим систему ASP.NET Identity, предназначенную для управления пользователями. Мы поговорим о некоторых упомянутых ранее механизмах и о том, как настроить данные профиля. Впервые идентификация каждого пользователя выполняется в действии Register контроллера AccountController. UserManager на основании значений полей формы создает пользователя в базе данных, а затем в методе SignInAsync создается объект идентификации и выпускается cookie, содержащий информацию об этой идентификации и служащий в качестве лицензии на аутентификацию.

Обратите внимание, что параметр isPersistent по умолчанию равен "false", потому что пользователь еще не обозначил, хочет ли он разрешить авторизацию на основе cookie для последующих посещений. Говорят, что система ASP.NET Identity основана на заявках (claims). Заявка - это просто сообщение о пользователе, составленное провайдером идентификации. Значение адреса электронной почты или имя пользователя, или назначения ролей - все это может считаться заявками. Меня смущает один момент - все эти данные хранятся в таблицах AspNetUsers и AspNetUsersRoles.

Но у нас есть еще одна таблица под названием "AspNetUserClaims". В ней можно хранить дополнительные пользовательские свойства. Но все указанные параметры должны рассматриваться как заявки и будут храниться в cookie аутентификации, который мы рассматривали ранее. Вернемся к методу Register. Представим себе, что мы хотим хранить имя пользователя в cookie в виде заявки, и чтобы при этом данное имя можно было добавить в верхний колонтитул сайта, не вытаскивая его из базы данных каждый раз, когда загружается страница. В методе Register после того, как пользователь создан, можно использовать UserManager.Claim и передать в него userId и новый claim.

Можно использовать встроенные типы заявок или пользовательскую строку в качестве названия заявки. Если использовать встроенные, строго типизированные заявки, например, GivenName (маловероятно, что мы ошибемся), и если передать эту информацию на другой веб-сайт, то вероятность того, что он сможет ее правильно истолковать, велика, поскольку эта заявка соответствует полной схеме URL. В качестве значения будем использовать model.FirstName. В рамках _LoginPartial добавим в верхний колонтитул сайта имя пользователя.

Нам понадобится другое пространство имен: System.Security.Claims. Если запрос прошел аутентификацию, приведем User.Identity к Claims.Identity. В результате мы получаем доступ к множеству полезных методов, к примеру, FindFirstValue, который в качестве параметра принимает тип заявки и передает GivenName, который мы уже настроили. Еще есть метод HasClaim, проверяющий существование заявки определенного типа, но мы можем просто проверить, не равно ли полученное значение null и вернуться к имени пользователя.

Затем, чтобы не отображать здесь UserName, мы заменим его на name. Итак, запустим приложение по клавише Ctrl+F5 и пройдем регистрацию. Теперь по окончании регистрации я вижу вверху не свое имя пользователя или адрес электронной почты, а надпись "Привет, Майк". Рассмотрим таблицу заявок. В ней есть значение нашего имени для конкретного UserId, которое сохраняется в cookie при каждой генерации. Еще один способ добавления дополнительной информации в объект, проходящий идентификацию, - добавление свойств в класс ApplicationUser.

Они будут храниться в базе данных. Например, если вам нужно, чтобы для большей безопасности у каждого пользователя был свой PIN-код, можно добавить сюда свойство Pin. Не забывайте использовать методы get и set, потому что в противном случае при переходе к консоли диспетчера пакетов и выполнении команды Update-Database для добавления этой информации в виде столбца ничего не произойдет. Чтобы действительно быстро продемонстрировать вам, как получить доступ к этим пользовательским свойствам, позвольте мне открыть базу данных и вручную задать PIN-код для пользователя, которого я только что создал.

Затем в представлении Index попробуем отобразить этот PIN-код на странице с помощью ViewBag. Очевидно, прежде чем отобразить PIN-код, нужно сначала добавить его в ViewBag. Сделаем это в рамках действия Index контроллера HomeController. Эта часть немного утомительна, поскольку, к сожалению, PIN-код не добавляется в объект, проходящий идентификацию, автоматически. Мне приходится получать объект ApplicationUser из класса UserManager. Итак, используем метод GetOwinContext, но на этот раз вместо метода Get можно применить метод GetUserManager. Чтобы этот код заработал, нужно добавить пространство имен Microsoft.AspNet.Identity.Owin. После этого используем метод FindById и передаем в него идентификатор текущего пользователя. Теперь можно добавить PIN-код пользователя в ViewBag. Построим решение и обновим страницу.

Как видите, внизу отображается наш PIN-код. Итак, я попытался познакомить вас с системой ASP.NET Identity и с тем, как ее можно использовать для управления пользователями. В следующем видео мы поговорим о том, как ограничить доступ пользователей к действиям контроллера на основании назначенных им ролей.