Вторник, 30 мая, 2017

Реализация oAuth-регистрации в проектах ASP.NET MVC 4 на примере ВКонтакте

комментарии: 12

В предыдущей статье "Регистрация через oAuth провайдера в проектах ASP.NET MVC 4", было рассказано, как настроить приложение ASP.NET MVC 4, чтобы пользователи могли регистрироваться через Facebook. Но oauth-подключение для Facebook (также как и для Google, Twitter и др.) является встроенной возможностью в классе OAuthWebSecurity. Как быть, если нужно сделать регистрацию oauth-провайдера, которого нет в стандартной реализации? Рассмотрим такой случай на примере социальной сети ВКонтакте.

Итак, начнем. Создаем проект ASP.NET MVC 4 Web Application, выбираем шаблон Internet Application.

Создаем класс нового oAuth-клиента

Добавим к проекту папку Code и в ней создадим класс VKontakteAuthenticationClient.cs. Наследуем класс от IAuthenticationClient, для этого подключаем пространство DotNetOpenAuth.AspNet. Нам нужно реализовать одно свойство ProviderName, и два метода RequestAuthentication, и VerifyAuthentication. С ProviderName все просто, это что-то типа текстового идентификатора клиента. Задать возвращаемое значение можно каким угодно, но лучше его сделать его читабельным и понятным: "vkontakte". Остальные два метода оставим пока как есть, их мы реализуем чуть позже.

using DotNetOpenAuth.AspNet;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace MvcApplication.Code
{
   public class VKontakteAuthenticationClient : IAuthenticationClient
   {
      public string appId;
      public string appSecret;

      public VKontakteAuthenticationClient(string appId, string appSecret)
      {
          this.appId = appId;
          this.appSecret = appSecret;
      }

      string IAuthenticationClient.ProviderName
      {
          get { return "vkontakte"; }
      }

      void IAuthenticationClient.RequestAuthentication(
                              HttpContextBase context, Uri returnUrl)
      {
          throw new NotImplementedException();
      }

      AuthenticationResult IAuthenticationClient.VerifyAuthentication(
                             HttpContextBase context)
      {
          throw new NotImplementedException();
      }
  }
}

И подключим наш новый класс клиента к проекту. В файле App_Start/AuthConfig.cs добавим в статический метод RegisterAuth такую строчку:

OAuthWebSecurity.RegisterClient(
       client: new VKontakteAuthenticationClient(
              "здесь будет app id", "здесь будет app secret"),
       displayName: "ВКонтакте", // надпись на кнопке
       extraData: null);

На данном этапе у нас есть подключенный клиент, который пока ничего не делает. Запустим проект и перейдем на страницу авторизации, там появилась кнопка ВКонтакте.

Далее зарегистрируем сайт у oauth-провайдера ВКонтакте и добавим код для двух методов клиента.

Комментарии

Дима Дима 04 июня, 2013, 07:05
Спасибо за статью!
Sergey Migel Sergey Migel 04 июня, 2013, 01:22
Так а можно ли запросом к API ВКонтакте получить e-mail юзера???
Sergey Migel Sergey Migel 04 июня, 2013, 01:27
И еще, есть ли возможность с веб-сайта asp.net mvc4 оставлять записи на стене пользователя, группы ?
Василий Мажекин Василий Мажекин 04 июня, 2013, 01:39
Можно тут посмотреть http://vk.com/dev/api_requests по аналогии ,как в приведенном; коде, сделать вызов и десериализовать в объект.
андрей андрей 10 июня, 2013, 08:36
Автору статьи спасибо
Антон Антон 03 сентября, 2013, 03:17
Спасибо за статью. Но есть один вопрос. В Вашем примере после успешной авторизации отправляется запрос users.get. Из документации АПИ - "Количество запросов от сервера зависит от количества пользователей, установивших приложение. Если приложение установило меньше 10 000 человек, то можно совершать 5 запросов в секунду" Вопрос: Если одновременно будут авторизовываться 100 пользователей, то с сайта будет отправлено 100 запросов users.get. Значит ли это, что мы превысим лимит запросов(ведь фактически, мы отправляем все запросы с одного компьютера - сервера)? Или же мы не должны превышать лимит по отдельному авторизованному пользователю? Буду очень признателен, если Вы разъясните мне этот момент. Заранее, спасибо
Василий Мажекин Василий Мажекин 05 сентября, 2013, 04:11
Приложение не надо никакое устанавливать, регистрироваться тоже можно сколько угодно, я сделал так, чтобы облегчить вход пользователя с социальной сети наиболее маскимально
Иван Тимофеев Иван Тимофеев 11 октября, 2014, 08:59
круть
Адиль Адилич Адиль Адилич 24 марта, 2015, 01:46
Спасибо за статью. Вопрос, а как бы этот механизм применить к Майл.Ру, дело в том что в него в методе VerifyAuthentication чтобы получить права вместо GET запроса надо рисовать POST, c параметром return_uri
Василий Мажекин Василий Мажекин 24 марта, 2015, 04:03
можно использовать https://oauth.io там mail.ru есть
Паша Левченко Паша Левченко 04 ноября, 2015, 08:58
спасибо за статью, вопрос ввиду того, что я начинающий не могу понять как довести до вывода на экран поля photo_50, я вижу что даже в адрес идет запись результата запроса address = String.Format( "https://api.vk.com/method/users.get?uids={0}&fields=photo_50", accessToken.user_id); однако не могу понять как довести это до ума, заранее спасибо
Pavel Pavel 28 февраля, 2016, 12:30
спасибо за статью, вопрос такой как можно после авторизации выводится информация о пользователе (first and last name) можете вкратце сказать как выводить аватарку пользователя и его имя с фамилией ?

 

Добавить комментарий

Войти через Twitter Войти через Facebook Войти через ВКонтакте Войти через Github Войти через Google Войти через LinkedIn

Copyright © 2013 All Rights Reserved for CodeHint.ru      Powered by Windows Azure