uLogin на ASP.Net сайте

в 10:27, , рубрики: ASP.NET, ulogin, авторизациия, Веб-разработка, социальные сети, метки: , , ,

Потребовалось на днях прикрутить uLogin к asp.net сайту, но с ходу найти готовый код как-то не получилось. Определенно кто-то столкнется с данным вопросом…


На мой выбор использовать ли uLogin (обзор на хабре) в своих проектах повлияли некоторые цифры. Не будем вдаваться в авторитетность ресурса, мне, почему-то, этого было достаточно. Сервис достаточно просто и удобно сделан — указываешь адрес своего сайта, выбираешь кнопки нужных провайдеров авторизации и получаешь пару кусков кода, которые нужно разместить на своем сайте. Если html код не особо зависит от того на чем создан сайт, то предлагаемый php код мне как-то не подошел. В итоге получилось то, что получилось :)

Полученный html я разместил на master странице сайта.

  1. <script src="http://ulogin.ru/js/ulogin.js"></script>
  2. <div id="uLogin" x-ulogin-params="display=small;optional=email,sex;fields=first_name,last_name,photo;providers=vkontakte,facebook,twitter,odnoklassniki,google;hidden=yandex,mailru,livejournal,openid,liveid;redirect_uri=http%3A%2F%2Fmysite.ru%2Fauth.aspx"></div>

* This source code was highlighted with Source Code Highlighter.

В адресе redirect_uri указано куда пошлют пользователя (с токеном uLogin) после того как он пройдет авторизацию через выбранный им провайдер. Получив token, нужно сходить на uLogin и спросить данные о пользователе.

  1. string link = string.Format("http://ulogin.ru/token.php?token={0}&host={1}", Request.Form["token"],
  2.               Request.ServerVariables["SERVER_NAME"]);
  3.  
  4. WebRequest reqGET = WebRequest.Create(link);
  5. string answer = "";
  6.       
  7. using (WebResponse resp = reqGET.GetResponse())
  8. {
  9.   using (Stream stream = resp.GetResponseStream())
  10.   {
  11.     if (stream != null)
  12.       using (StreamReader sr = new StreamReader(stream))
  13.       {
  14.         answer = sr.ReadToEnd();
  15.       }
  16.   }
  17. }

* This source code was highlighted with Source Code Highlighter.

В ответ получаем jSON строку, с которой я решил разделаться следующим образом:

  1. public class JSONHelper
  2. {
  3.   public static T Deserialise<T>(string json)
  4.   {
  5.     T obj = Activator.CreateInstance<T>();
  6.     using (MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
  7.     {
  8.       DataContractJsonSerializer serialiser = new DataContractJsonSerializer(obj.GetType());
  9.       obj = (T)serialiser.ReadObject(ms);
  10.     }
  11.     return obj;
  12.   }
  13. }
  14.  
  15. public class iUser
  16. {
  17.   public string network { get; set; }
  18.   public string uid { get; set; }
  19.   public string first_name { get; set; }
  20.   public string last_name { get; set; }
  21.   public string email { get; set; }
  22.   public string sex { get; set; }
  23.  
  24.   public override string ToString()
  25.   {
  26.     return string.Format("network={0},uid={1},first_name={2},last_name={3}", network, uid, first_name, last_name);
  27.   }
  28. }

* This source code was highlighted with Source Code Highlighter.

У uLogin можно спрашивать еще несколько других атрибутов. Я добавил некоторые в параметр optional чтобы не нервировать пользователя лишними вопросами (допустим ввод email адреса, если провайдер не может передать его)

Осталось десериализовать:

  1. iUser usr = JSONHelper.Deserialise<iUser>(answer);

* This source code was highlighted with Source Code Highlighter.

Ну, а дальше каждый решает сам что делать с полученными данными. Как пример — положить себе в базу и отправить пользователю куку с токеном, для авторизации на сайте.

Тестировал на своих аккаунтах. Может быть более обширное использование сможет выявить имеющиеся баги.
Надеюсь что решение получилось не только короткое, но и полезное.

Автор: iklementiev

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js