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

Видео урок: Authenticating users with Facebook

Основы ASP.NET MVC 5

В этом видео мы будем реализовывать для нашего приложения учетную запись Facebook и тестировать ее. Почти весь процесс настройки учетной записи Facebook сводится к открытию файла Startup.Auth.cs и раскомментированию вот этого вызова UseFacebookAuthentication. Сделать это можно, выделив нужный фрагмент, нажав сначала клавишу Ctrl+K, а затем Ctrl+U. Но как и при работе с любым из поддерживаемых провайдеров необходимо сначала настроить профиль учетной записи и приложения. Если у вас уже есть учетная запись Facebook, то вам действительно легко будет зайти на сайт developers.facebook.com и приступить к настройке новых приложений.

Вам нужно будет указать платформу для своего приложения. Наше приложение будет веб-сайтом. Затем вводим URL сайта, чтобы Facebook знал, запросы с каких доменов стоит разрешать. Я все еще работаю на локальном хосте, поэтому буду использовать вот этот URL. Еще нужно указать домены приложения. После этого я сохраню изменения, скопирую ID и секретный номер приложения (App secret) и укажу их в качестве значений параметров метода UseFacebookAuthentication. Если вернуться сюда, то можно увидеть, что я уже вставил эти значения в вызов данного метода.

Одна из проблем, с которой мы столкнемся, если войдем в систему и нас перенаправят на главную страницу сайта, - у нас не будет текущего счета. А все потому, что мы полностью заблокировали метод Register. Поэтому вот этот код в файле HomeController.cs не будет работать. Рассмотрим метод Register в файле AccountController.cs. Пожалуй, я бы не стал копировать этот код и вставлять его в действие, обрабатывающее регистрацию на основе учетной записи Facebook. Возможно, вы рассматриваете вариант переноса этого кода в действие CheckingAccountController и перенаправление на это действие.

Тем не менее этот код связан с моделью CheckingAccount и во всяком случае точно не относится к AccountController. Но переход от одного действия к другому в середине процесса регистрации пользователя может привести к весьма запутанной последовательности действий и сильно усложнить обработку ошибок. Возможно, вы рассматриваете и вариант добавления в модель CheckingAccount метода, предназначенного для создания пользователя. Часто повторяемая в MVC мантра - "Делай контроллеры худыми, а модели толстыми". В контроллерах должно содержаться минимально возможное количество логики, оставшуюся часть нужно размещать в модели.

Но хотя добавлять сюда методы вполне приемлемо, мне кажется, что CheckingAccount не должен отвечать за создание самого себя. Я полагаю, что нужно создать служебный класс для тех видов операций, которые необязательно должны соответствовать действиям контроллера или моделям. Щелкнем правой кнопкой мыши в области проекта и добавим новую папку под названием "Services". Внутри нее создадим новый класс - CheckingAccountService. Класс CheckingAccountService будет обладать приватным свойством типа ApplicationDbContext. Напишем конструктор, который принимает в качестве параметра DbContext и задает значение db.

Разрешим соответствующее пространство имен. Наконец, напишем метод CreateCheckingAccount, принимающий в качестве параметров имя, фамилию, идентификатор пользователя и начальный баланс. Затем скопируем вот эти строчки из метода Register и, внеся несколько изменений, получим служебный метод, который можно вызывать откуда угодно. Итак, мы уже объявили db, и передадим в этот метод значения соответствующих параметров.

Теперь в методе Register можно заменить этот код и создать новый экземпляр CheckingAccountService. Передадим сюда существующий DbContext, который уже настроил наш компонент аутентификации с помощью метода GetOwinContext класса HttpContext. После этого воспользуемся generic-методом Get с параметром ApplicationDbContext. Теперь создадим счет. Скопируем вот эти строки в буфер обмена, поскольку будем выполнять нечто подобное и в методе FacebookLogin.

После того как мы завершим регистрацию с помощью учетной записи Facebook, нам предложат выбрать имя пользователя для приложения MVC Bank. Далее действие ExternalLoginConfirmation будет обрабатывать создание в системе нового пользователя. Поэтому давайте найдем это действие. В результате вызова AddLoginAsync в таблицу AspNetUserLogins будет вставлена строка, устанавливающая связь между идентификатором пользователя в Facebook и идентификатором пользователя в системе. Итак, предположим, что если все выполняется успешно, мы создаем текущий счет для данного пользователя.

Пока мы немножко схитрим и укажем в качестве имени - "Facebook", а фамилии - "User". А еще запустим акцию, в рамках которой каждому пользователю, зарегистрированному в нашей системе через учетную запись Facebook, выдается бонус - 500 долларов. Итак, перезапустим наш сайт по клавише Ctrl+F5. Теперь на странице входа в систему справа есть кнопка Facebook. Я уже зарегистрирован в Facebook, поэтому меня сразу же просят разрешить приложению MVC Bank выполнять некоторые действия.

В этом шаблоне проекта по умолчанию зачастую имя пользователя и адрес электронной почты используются взаимозаменяемо, поэтому для этого сайта я могу указать имя пользователя и через слэш адрес электронной почты. Теперь я вошел в систему через учетную запись Facebook, и в базе данных создался пользователь, аналогичный всем остальным пользователям, за исключением того, что для него не хранится хэшированный пароль. Можно еще рассмотреть таблицу AspNetUserLogins, в которой появляется новая строка, связывающая идентификатор пользователя MVC Bank с идентификатором пользователя Facebook.

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