Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

MVC 5 Owin авторизация на примере Вконтакте

Anna | 17.06.2014 | нет комментариев
Не так давным-давно вышел mvc 5 и одним из ключевых изменений является система авторизации. При создании «пустого» mvc 5 плана есть вероятность подключить авторизацию для Facebook, Google, Twitter и Microsoft аккаунтов. Я здесь же полез разбираться с тем как это все работает и итогом стал «middleware» модуль для сети Вконтакте. Его дозволено поставить через nuget пакеты поискав «Duke.Owin.VkontakteMiddleware» и посмотреть исходники:github.com/DukeNuken/Duke.Owin.VkontakteMiddleware

В интернете есть много статей о owin авторизации и плане katana с которыми дозволено ознакомится и даже скачать исходники.

А теперь предлагаю в всеобщих чертах обсудить как это все работает. Немножко истории. Когда то давным-давно, лет 6 назад, один мой клиент просил сделать на сайте прекрасные ссылки типа “/account/register” и от того что план был на asp.net то исключительным решением было установление модуля UrlRewriting для IIS и на сайте все работало отлично, но вот в студии такие линки ясно не открывались, что доставляло некоторые неудобства. С тех пор как Microsoft выпустило mvc логика UrlRewriting осуществляеться на стороне плана (RouteConfig), верно так же делается на стороне плана и оптимизация скриптов (BundleConfig). Это разрешает правильно трудиться плану все зависимости от сервера. По такому же тезису в mvc 5 добавилась авторизация.

Класс Startup находится в плане /App_Start и в нем есть каждого одна функция ConfigureAuth(IAppBuilder app). Она дергается при старте плана и подгружает так называемые middleware модули. Что это такое и как они работают? По сути это классы которые наследуются от AuthenticationMiddleware. В этом классе есть конструктор и способ CreateHandler(). Данный способ вызывается при всяком обращении к странице и все что он должен сделать это сделать AuthenticationHandler тот, что, в свою очередь, имеет 2 способа. Разглядим их подробнее

1) protected override Task ApplyResponseChallengeAsync() — данный способ вызывается позже отработки логики в контролах и перед отправкой response к пользователю. Он делает 3 значимых шага. Проверяет код http результата — равен ли 401 (not autorized), если да то особым хелпером проверяется должен ли данный модуль делать авторизацию, если да то делается редирект на сайт авторизации и в итоге юзер видит такую вот форму:

image

То есть 1-й способ реально отрабатывает только позже того как юзер нажимает на кнопку Vknotakte на странице логина. Пример страницы дозволено увидеть здесь, во всех других случаях легко передает управление дальше.

Позже подтверждения юзер будет переброшен назад на ваш сайт на страницу возврата модуля. Приблизительно такую ‘/signin-vkontakte?code=8e40fbe05c7ec232c0′ (эта страница возврата задается в параметрах модуля) и в данный момент отрабатывает 2-й способ способ

2) public override async Task<bool> InvokeAsync() — данный способ дергается на всякой странице до того как отрабатывают контролы и сверяет свою «базовую» линку c запросом. Если они совпадают, то происходит сама авторизация. На примере модуля для вконтакте данный способ по сути ожидает линку ‘/signin-vkontakte’ от первого способа.

Внутри способа InvokeAsync дергается страница «oauth.vk.com/access_token» и получает token, позже этого происходит обращение к Vkontakte API и приобретение информации о пользователе — имя и id. На основании этих данных создается AuthenticationTicket. В свою очередь AuthenticationTicket применяется для создания ReturnEndpointContext объекта и сохранение информации через Microsoft.Owin.Security.AuthenticationManager. Позже этого пользователь перебрасывается на /Account/ExternalLoginCallback и может закончить регистрацию указав под каким именем он хочет зарегистрироваться на сайте.

Хотелось бы подметить несколько пророческой:

1) Поведение «middleware» модуля дюже схоже на обыкновенный http модуль, тот, что получает управление в начале и в конце запроса.
image

2) Казалось бы, есть два типа регистрации — регистрация на сайте и регистрация через owin модули, но в финальном результате когда позже авторизации на Вконтакте пользователь будет возвращен на страницу сайта “/Account/ExternalLoginCallback” (на странице будет сообщение что он Вконтакт авторизацию прошел удачно, текстовое поле для указания имени и кнопка Register), то только здесь при нажатии на Register будет сделан обыкновенный аккаунт и в нем будет указано что он относится к «Vkontakte» провайдеру и в качестве параметра там будет userid. В базе это выглядит так

image

То есть сама по себе owin авторизация на сайте ничего не делает, а только предоставляет информацию для традиционной регистрации.

Спасибо за внимание.

Живой пример здесь freemusiclib.com/Account/Login

 

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB