Integrating "Sign In With LinkedIn" Functionality To An Application

This article demonstrates how to integrate "login using the LinkedIn credential" in your web application.

This article demonstrates how to integrate "Log in using LinkedIn" functionality to your web application. There are four ways to integrate LinkedIn - REST API, JavaScript SDK, Android SDK, and iOS SDK. Here, I will explain how to integrate using REST API.
 
Linkedin allows external partner websites and applications to use the LinkedIn API (Application Programming Interface). To understand Linkedin API and OAuth validation, visit https://developer.linkedin.com/docs/oauth2  and https://developer.linkedin.com/docs/rest-api
 
Brief request summary: Follow step 1 to step 7 
 
  
To use LinkedIn API, first, you need to register your app on LinkedIn. To register your app, follow the following steps.
 
Step 1

Log into LinkedIn using your credentials for the Linkedin developer portal https://developer.linkedin.com.

Step 2

Go to "MyApps" section.

Step 3

Click on "Create Application".
 
 
Step 4

Enter all the necessary details related to your app.
 
 
Step 5

Click on the "Submit" button. On the next page, you will be provided with a "Client Id" and "Client Secret key". Save these values separately.
We will use these keys later in our web application to validate our request. On the page, check all the permission access options to get more information and add a redirect URL. This URL should be your app API which will capture the access code or error code returned from LinkedIn API as a parameter.

Here, our redirect URL is http://localhost:52986/Home/SaveLinkedinUser.

 
Step 6

Click "Update" and your app is ready to use.
 
Now, we will test this functionality using an ASP.NET MVC application (.NET Framework).
  1. Create an MVC project using VisualStudio IDE. 
  2. Add Newtonsoft library from NuGet Package Manager into your project. This library will be used to serialize and deserialize JSON object.
  3. Add System.Net.Http assembly using "Add a reference" option. This will be used to request URLs using HttpClient class instance.
  4. Add a controller named Home and add the following code.
Note
  • Refer fields returned by LinkedIn API here https://developer.linkedin.com/docs/fields/basic-profile 
  • To know more about request parameter, follow https://developer.linkedin.com/docs/oauth2 
  1. using LogInUsingLinkedinApp.Models;  
  2. using LogInUsingLinkedinApp.Utils;  
  3. using Newtonsoft.Json;  
  4. using System;  
  5. using System.Net.Http;  
  6. using System.Threading.Tasks;  
  7. using System.Web.Mvc;  
  8.   
  9. namespace LogInUsingLinkedinApp.Controllers  
  10. {  
  11.     public class HomeController : Controller  
  12.     {  
  13.         /// <summary>  
  14.         /// Query string parameters to fetch Linked in user information   
  15.         /// </summary>  
  16.         private const string LinkedinUserInfoParameters = "id,first-name,last-name,maiden-name,formatted-name,phonetic-first-name,phonetic-last-name,formatted-phonetic-name,headline,location,picture-url,industry,current-share,num-connections,num-connections-capped,summary,specialties,positions,picture-urls,site-standard-profile-request,api-standard-profile-request,public-profile-url,email-address,languages,skills";  
  17.   
  18.         /// <summary>  
  19.         /// Returns login page if user is not logged in else return user profile  
  20.         /// </summary>  
  21.         /// <returns>return page</returns>  
  22.         public async Task<ActionResult> Index()  
  23.         {  
  24.             string token = (string)Session["user"];  
  25.             if (string.IsNullOrEmpty(token))  
  26.             {  
  27.                 return View();  
  28.             }  
  29.             else  
  30.             {  
  31.                 return View("User", await GetUserFromAccessTokenAsync(token));  
  32.             }  
  33.         }  
  34.   
  35.         /// <summary>  
  36.         /// Listen response from Linkedin after user authorization  
  37.         /// </summary>  
  38.         /// <param name="code">access code returned from Linkedin</param>  
  39.         /// <param name="state">A value passed by application to prevent Cross-site request forgery attack</param>  
  40.         /// <param name="error">A code indicating the type of error</param>  
  41.         /// <param name="error_description">A URL-encoded textual description that summarizes error</param>  
  42.         /// <returns></returns>  
  43.         [HttpGet]  
  44.         public async Task<ActionResult> SaveLinkedinUser(string code, string state, string error, string error_description)  
  45.         {  
  46.             if(string.IsNullOrEmpty(code))  
  47.             {  
  48.                 return View("Error");  
  49.             }  
  50.   
  51.             var httpClient = new HttpClient  
  52.             {  
  53.                 BaseAddress = new Uri("https://www.linkedin.com/")  
  54.             };  
  55.             var requestUrl = $"oauth/v2/accessToken?grant_type=authorization_code&code={code}&redirect_uri={AppConfig.Get("Linkedin.RedirectUrl")}&client_id={AppConfig.Get("Linkedin.ClientID")}&client_secret={AppConfig.Get("Linkedin.SecretKey")}";  
  56.             var response = await httpClient.GetAsync(requestUrl);  
  57.             var token = JsonConvert.DeserializeObject<TokenResponse>(await response.Content.ReadAsStringAsync());  
  58.             Session["user"] = token.Access_token;  
  59.             return View("User", await GetUserFromAccessTokenAsync(token.Access_token));  
  60.         }  
  61.   
  62.         /// <summary>  
  63.         /// Used to sign out user  
  64.         /// </summary>  
  65.         /// <returns>return Login page</returns>  
  66.         [HttpGet]  
  67.         public ActionResult SignOut()  
  68.         {  
  69.             Session["user"] = null;  
  70.             return View("Index");  
  71.         }  
  72.   
  73.         /// <summary>  
  74.         /// To get user information from access token received from linked in  
  75.         /// </summary>  
  76.         /// <param name="token">access token</param>  
  77.         /// <returns>user data</returns>  
  78.         private async Task<UserInfo> GetUserFromAccessTokenAsync(string token)  
  79.         {  
  80.             var apiClient = new HttpClient  
  81.             {  
  82.                 BaseAddress = new Uri("https://api.linkedin.com")  
  83.             };  
  84.             var url = $"/v1/people/~:({LinkedinUserInfoParameters})?oauth2_access_token={token}&format=json";  
  85.             var response = await apiClient.GetAsync(url);  
  86.             var jsonResponse = await response.Content.ReadAsStringAsync();  
  87.             return JsonConvert.DeserializeObject<UserInfo>(jsonResponse);  
  88.         }  
  89.     }  
  90. }  
Step 7

Add a Models folder and add the following models. These models will be used to store the information received from LinkedIn API.
 
  1. using Newtonsoft.Json;  
  2. using System.Collections.Generic;  
  3.   
  4. namespace LogInUsingLinkedinApp.Models  
  5. {  
  6.   
  7.     //* JsonProperty(PropertyName = "name") attribute used here  
  8.     //* to map json property name with object property name   
  9.     //* while deseralizing a json into object  
  10.   
  11.     public class HeaderValue  
  12.     {  
  13.         [JsonProperty(PropertyName = "name")]  
  14.         public string Name { get; set; }  
  15.   
  16.         [JsonProperty(PropertyName = "value")]  
  17.         public string Value { get; set; }  
  18.     }  
  19.   
  20.     public class Headers  
  21.     {  
  22.         [JsonProperty(PropertyName = "_total")]  
  23.         public int Total { get; set; }  
  24.   
  25.         [JsonProperty(PropertyName = "values")]  
  26.         public List<HeaderValue> Values { get; set; }  
  27.     }  
  28.   
  29.     public class ApiStandardProfileRequest  
  30.     {  
  31.         [JsonProperty(PropertyName = "headers")]  
  32.         public Headers Headers { get; set; }  
  33.   
  34.         [JsonProperty(PropertyName = "url")]  
  35.         public string Url { get; set; }  
  36.     }  
  37.   
  38.     public class Company  
  39.     {  
  40.         [JsonProperty(PropertyName = "name")]  
  41.         public string Name { get; set; }  
  42.   
  43.         [JsonProperty(PropertyName = "id")]  
  44.         public int? Id { get; set; }  
  45.   
  46.         [JsonProperty(PropertyName = "industry")]  
  47.         public string Industry { get; set; }  
  48.   
  49.         [JsonProperty(PropertyName = "size")]  
  50.         public string Size { get; set; }  
  51.   
  52.         [JsonProperty(PropertyName = "type")]  
  53.         public string Type { get; set; }  
  54.     }  
  55.   
  56.     public class Country  
  57.     {  
  58.         [JsonProperty(PropertyName = "code")]  
  59.         public string Code { get; set; }  
  60.   
  61.         [JsonProperty(PropertyName = "name")]  
  62.         public string Name { get; set; }  
  63.     }  
  64.   
  65.     public class Location  
  66.     {  
  67.   
  68.         [JsonProperty(PropertyName = "country")]  
  69.         public Country Country { get; set; }  
  70.   
  71.         [JsonProperty(PropertyName = "name")]  
  72.         public string Name { get; set; }  
  73.     }  
  74.   
  75.     public class StartDate  
  76.     {  
  77.   
  78.         [JsonProperty(PropertyName = "month")]  
  79.         public int Month { get; set; }  
  80.   
  81.         [JsonProperty(PropertyName = "year")]  
  82.         public int Year { get; set; }  
  83.     }  
  84.   
  85.     public class Experience  
  86.     {  
  87.         [JsonProperty(PropertyName = "company")]  
  88.         public Company Company { get; set; }  
  89.   
  90.         [JsonProperty(PropertyName = "id")]  
  91.         public int Id { get; set; }  
  92.   
  93.         [JsonProperty(PropertyName = "isCurrent")]  
  94.         public bool IsCurrent { get; set; }  
  95.   
  96.         [JsonProperty(PropertyName = "location")]  
  97.         public Location Location { get; set; }  
  98.   
  99.         [JsonProperty(PropertyName = "startDate")]  
  100.         public StartDate StartDate { get; set; }  
  101.   
  102.         [JsonProperty(PropertyName = "title")]  
  103.         public string Title { get; set; }  
  104.     }  
  105.   
  106.     public class Positions  
  107.     {  
  108.         [JsonProperty(PropertyName = "_total")]  
  109.         public int Total { get; set; }  
  110.   
  111.         [JsonProperty(PropertyName = "values")]  
  112.         public List<Experience> Values { get; set; }  
  113.     }  
  114.   
  115.     public class SiteStandardProfileRequest  
  116.     {  
  117.         [JsonProperty(PropertyName = "url")]  
  118.         public string Url { get; set; }  
  119.     }  
  120.   
  121.     public class UserInfo  
  122.     {  
  123.         [JsonProperty(PropertyName = "apiStandardProfileRequest")]  
  124.         public ApiStandardProfileRequest ApiStandardProfileRequest { get; set; }  
  125.   
  126.         [JsonProperty(PropertyName = "emailAddress")]  
  127.         public string EmailAddress { get; set; }  
  128.   
  129.         [JsonProperty(PropertyName = "firstName")]  
  130.         public string FirstName { get; set; }  
  131.   
  132.         [JsonProperty(PropertyName = "formattedName")]  
  133.         public string FormattedName { get; set; }  
  134.   
  135.         [JsonProperty(PropertyName = "headline")]  
  136.         public string Headline { get; set; }  
  137.   
  138.         [JsonProperty(PropertyName = "id")]  
  139.         public string Id { get; set; }  
  140.   
  141.         [JsonProperty(PropertyName = "industry")]  
  142.         public string Industry { get; set; }  
  143.   
  144.         [JsonProperty(PropertyName = "lastName")]  
  145.         public string LastName { get; set; }  
  146.   
  147.         [JsonProperty(PropertyName = "location")]  
  148.         public Location Location { get; set; }  
  149.   
  150.         [JsonProperty(PropertyName = "maidenName")]  
  151.         public string MaidenName { get; set; }  
  152.   
  153.         [JsonProperty(PropertyName = "numConnections")]  
  154.         public int NumConnections { get; set; }  
  155.   
  156.         [JsonProperty(PropertyName = "numConnectionsCapped")]  
  157.         public bool NumConnectionsCapped { get; set; }  
  158.   
  159.         [JsonProperty(PropertyName = "pictureUrl")]  
  160.         public string PictureUrl { get; set; }  
  161.   
  162.         [JsonProperty(PropertyName = "positions")]  
  163.         public Positions Positions { get; set; }  
  164.   
  165.         [JsonProperty(PropertyName = "publicProfileUrl")]  
  166.         public string PublicProfileUrl { get; set; }  
  167.   
  168.         [JsonProperty(PropertyName = "siteStandardProfileRequest")]  
  169.         public SiteStandardProfileRequest SiteStandardProfileRequest { get; set; }  
  170.   
  171.         [JsonProperty(PropertyName = "summary")]  
  172.         public string Summary { get; set; }  
  173.     }  
  174. }  
  1. using Newtonsoft.Json;  
  2.   
  3. namespace LogInUsingLinkedinApp.Models  
  4. {  
  5.     public class TokenResponse  
  6.     {  
  7.         [JsonProperty(PropertyName = "access_token")]  
  8.         public string Access_token { get; set;}  
  9.   
  10.         [JsonProperty(PropertyName = "expires_in")]  
  11.         public int Expires_in { get; set; }  
  12.   
  13.     }  
  14. }  
Step 8

Now, add Views to log in and display user profile.
 
File : Index.cshtml : For login using Linkedin page
  1. @using LogInUsingLinkedinApp.Utils;  
  2.   
  3. @{  
  4.     Layout = null;  
  5. }  
  6.   
  7. <!DOCTYPE html>  
  8.   
  9. <html>  
  10. <head>  
  11.     <meta name="viewport" content="width=device-width" />  
  12.     <title>Login</title>  
  13. </head>  
  14. <body style="background-color:#f3f3f3;">  
  15.     <div style="align-items:center;align-items:center;padding:50px;border:1px double #3d2487;width:260px;background-color:white">  
  16.         <h2>Hi Guest</h2>  
  17.         <p>  
  18.             <a href="https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id=@AppConfig.Get("Linkedin.ClientID")&redirect_uri=@AppConfig.Get("Linkedin.RedirectUrl")&state=987654321&scope=r_emailaddress%20r_basicprofile">  
  19.   
  20.                 <img src="~/Resources/login-linkedin.png" style="width:215px;height:41px"/>  
  21.             </a>  
  22.         </p>  
  23.     </div>  
  24. </body>  
  25. </html>  
File : User.cshtml : To display user data
  1. @model LogInUsingLinkedinApp.Models.UserInfo  
  2.   
  3. @{  
  4.     Layout = null;  
  5. }  
  6.   
  7. <!DOCTYPE html>  
  8.   
  9. <html>  
  10. <head>  
  11.     <meta name="viewport" content="width=device-width" />  
  12.     <title>User Profile</title>  
  13. </head>  
  14. <body style="border:0px;background-color:black;color:white">  
  15.     <table style="width:100%;border:0px">  
  16.         <tr>  
  17.             <td><img src="@Html.DisplayFor(model => model.PictureUrl)" /></td>  
  18.             <td>  
  19.                 <i style="color:yellow;font-size:23px">@Html.DisplayFor(model => model.EmailAddress)</i>  
  20.                 <a href="~/Home/SignOut" style="border:1px dashed yellow;border-radius:4px;padding:8px;color:orange;font-size:17px">SignOut</a>  
  21.                 <p>  
  22.                     <b style="color:yellow">Summary : </b>@Html.DisplayFor(model => model.Summary)  
  23.                 </p>  
  24.             </td>  
  25.         </tr>  
  26.         <tr>  
  27.             <td></td>  
  28.             <td>  
  29.                 <div>  
  30.                     <p>  
  31.                         <b style="color:yellow"> First Name : </b>@Html.DisplayFor(model => model.FirstName)  
  32.                     </p>  
  33.                     <p>  
  34.                         <b style="color:yellow"> Maiden Name :</b> @Html.DisplayFor(model => model.MaidenName)  
  35.                     </p>  
  36.                     <p>  
  37.                         <b style="color:yellow"> Last Name : </b> @Html.DisplayFor(model => model.LastName)  
  38.                     </p>  
  39.                     <p>  
  40.                         <b style="color:yellow">Formatted Name :</b> @Html.DisplayFor(model => model.FormattedName)  
  41.                     </p>  
  42.                     <p>  
  43.                         <b style="color:yellow"> HeadLine : </b> @Html.DisplayFor(model => model.Headline)  
  44.                     </p>  
  45.                     <p>  
  46.                         <b style="color:yellow"> Public Profile Url : </b><a href="@Html.DisplayFor(model => model.PublicProfileUrl)">@Html.DisplayFor(model => model.PublicProfileUrl)</a>  
  47.                     </p>  
  48.                     <p>  
  49.                         <b style="color:yellow"> Industry :</b> @Html.DisplayFor(model => model.Industry)  
  50.                     </p>  
  51.                     <p>  
  52.                         <b style="color:yellow"> Connections : </b> @Html.DisplayFor(model => model.NumConnections)  
  53.                     </p>  
  54.                     <p>  
  55.                         <b style="color:yellow"> Connections capped :</b> @Html.DisplayFor(model => model.NumConnectionsCapped)  
  56.                     </p>  
  57.   
  58.                 </div>  
  59.             </td>  
  60.         </tr>  
  61.         @if (Model.Positions != null)  
  62.         {  
  63.             <tr>  
  64.                 <td></td>  
  65.                 <td>  
  66.                     <div>  
  67.                         <b style="color:yellow">Positions: </b>  
  68.                         <p>Total : @Model.Positions.Total</p>  
  69.                         @if (Model.Positions.Values != null)  
  70.                         {  
  71.                             foreach (var data in Model.Positions.Values)  
  72.                             {  
  73.                                 <div style="padding:20px;border:1px dotted white;border-bottom:1px dotted white;">  
  74.                                     <p><b style="color:antiquewhite">Id :</b> @data.Id</p>  
  75.                                     <p><b style="color:antiquewhite">Company :</b> @data.Company.Name | Industry : @data.Company.Industry | Id : @data.Company.Id | Size :@data.Company.Size | Type: @data.Company.Type</p>  
  76.   
  77.                                     <p><b style="color:antiquewhite">IsCurrent :</b>@data.IsCurrent</p>  
  78.                                     <p><b style="color:antiquewhite">Location :</b> @data.Location.Country.Code | @data.Location.Country.Name</p>  
  79.                                     <p><b style="color:antiquewhite">Start Date :</b> Month : @data.StartDate.Month | Year : @data.StartDate.Year</p>  
  80.                                     <p><b style="color:antiquewhite">Title :</b>@data.Title</p>  
  81.                                 </div>  
  82.                             }  
  83.                         }  
  84.                     </div>  
  85.                 </td>  
  86.             </tr>  
  87.         }  
  88.   
  89.         <tr>  
  90.             <td></td>  
  91.             <td>  
  92.                 @if (Model.SiteStandardProfileRequest != null)  
  93.                 {  
  94.                     <p><b style="color:yellow"> SiteStandardProfileRequest :</b> <a href="@Model.SiteStandardProfileRequest.Url">@Model.SiteStandardProfileRequest.Url</a></p>  
  95.                 }  
  96.                 @if (Model.ApiStandardProfileRequest != null)  
  97.                 {  
  98.                     <div>  
  99.                         <b style="color:yellow">  
  100.                             ApiStandardProfileRequest :  
  101.                         </b>  
  102.                         <p><b style="color:antiquewhite">url : </b><a href="@Model.ApiStandardProfileRequest.Url">@Model.SiteStandardProfileRequest.Url</a> </p>  
  103.                         <b style="color:antiquewhite">Header : </b>  
  104.                         @if (Model.ApiStandardProfileRequest.Headers != null)  
  105.                         {  
  106.                             <div style="padding:15px">  
  107.                                 <b style="color:antiquewhite">  
  108.                                     Total :  
  109.                                 </b> @Model.ApiStandardProfileRequest.Headers.Total<br />  
  110.                                 <b style="color:antiquewhite">Values:</b>  
  111.                                 @foreach (var value in @Model.ApiStandardProfileRequest.Headers.Values)  
  112.                                 {  
  113.                                     <p><i>Name :@value.Name , Value :@value.Value</i></p>  
  114.   
  115.                                 }  
  116.                             </div>  
  117.                         }  
  118.                     </div>  
  119.                 }  
  120.             </td>  
  121.         </tr>  
  122.     </table>  
  123. </body>  
  124. </html>  
File : Error.cshtml : To display error message
  1. @{  
  2.     Layout = null;  
  3. }  
  4.   
  5. <!DOCTYPE html>  
  6.   
  7. <html>  
  8. <head>  
  9.     <meta name="viewport" content="width=device-width" />  
  10.     <title>Error</title>  
  11. </head>  
  12. <body>  
  13.     <h1> Ooops, Something went wrong  
  14.     </h1>  
  15. </body>  
  16. </html>  
Step 9

Now, in Web.Config file, add the following configuration.
  1. <!--Configuration-->  
  2. <add key="Linkedin.ClientID" value="81t4ctrlv5goix"/>  
  3. <add key="Linkedin.SecretKey" value="5FSVMDbUIikls26z"/>  
  4. <add key="Linkedin.RedirectUrl" value="http://localhost:52986/Home/SaveLinkedinUser"/>  
Enter your own Client id and Secret key that you received while creating the app in Linkedin.
 
Step 10

Run the Project and hit Url: http://localhost:52986/Home/Index and click on "Login using LinkedIn" button.
Now, the LinkedIn API will ask for your permission as shown in the figure to grant access to your app. Click on "Allow" button and you will see your basic details on our created page.
 
 
 
The user data response we will get from LinkedIn API will look like this.
  1. {  
  2.     "apiStandardProfileRequest": {  
  3.         "headers": {  
  4.             "_total": 1,  
  5.             "values": [  
  6.                 {  
  7.                     "name""x-li-auth-token",  
  8.                     "value""name:grK3"  
  9.                 }  
  10.             ]  
  11.         },  
  12.         "url""https://api.linkedin.com/v1/people/MtOEYw7xLz"  
  13.     },  
  14.     "emailAddress""tarun.rajak@csgsol.com",  
  15.     "firstName""Tarun",  
  16.     "formattedName""Tarun (Tarun Kumar Rajak) Rajak",  
  17.     "headline""Senior Software Engineer at Cobb Systems Group, LLC",  
  18.     "id""MtOEYw7xLz",  
  19.     "industry""Information Technology and Services",  
  20.     "lastName""Rajak",  
  21.     "location": {  
  22.         "country": {  
  23.             "code""in"  
  24.         },  
  25.         "name""Bengaluru Area, India"  
  26.     },  
  27.     "maidenName""Tarun Kumar Rajak",  
  28.     "numConnections": 0,  
  29.     "numConnectionsCapped"false,  
  30.     "pictureUrl""https://media.licdn.com/dms/image/C5103AQH7j-LxFD05IQ/profile-displayphoto-shrink_100_100/0?e=1528034400&v=alpha&t=yCO9gnj_yKKR_b3ZKB2Ds5WOKqiAnN5hMz6aZMa8dUg",  
  31.     "positions": {  
  32.         "_total": 2,  
  33.         "values": [  
  34.             {  
  35.                 "company": {  
  36.                     "name""Cobb Systems Group, LLC"  
  37.                 },  
  38.                 "id": 1258473040,  
  39.                 "isCurrent"true,  
  40.                 "location": {  
  41.                     "country": {  
  42.                         "code""us",  
  43.                         "name""United States"  
  44.                     },  
  45.                     "name""United States"  
  46.                 },  
  47.                 "startDate": {  
  48.                     "month": 1,  
  49.                     "year": 2018  
  50.                 },  
  51.                 "title""Senior Software Engineer"  
  52.             },  
  53.             {  
  54.                 "company": {  
  55.                     "id": 1241076,  
  56.                     "industry""Information Technology & Services",  
  57.                     "name""CSG Solutions India Pvt. Ltd.",  
  58.                     "size""2-10",  
  59.                     "type""Privately Held"  
  60.                 },  
  61.                 "id": 1257788050,  
  62.                 "isCurrent"true,  
  63.                 "location": {  
  64.                     "country": {  
  65.                         "code""in",  
  66.                         "name""India"  
  67.                     },  
  68.                     "name""Bengaluru Area, India"  
  69.                 },  
  70.                 "startDate": {  
  71.                     "month": 6,  
  72.                     "year": 2016  
  73.                 },  
  74.                 "title""Software Engineer"  
  75.             }  
  76.         ]  
  77.     },  
  78.     "publicProfileUrl""https://www.linkedin.com/in/tarun-rajak-41a332161",  
  79.     "siteStandardProfileRequest": {  
  80.         "url""https://www.linkedin.com/profile/view?id=AAoAACardtYB8UA124fOjTz7p_hdHGN7ex7mnKI&authType=name&authToken=grK3&trk=api*a5219905*s5538355*"  
  81.     },  
  82.     "summary""Tarun is a full stack Software Developer with a specialty in C#, SQL Server, ASP.NET MVC and other Microsoft technologies. He is expert in writing algorithms and currently working in CSG Solutions India Pvt Ltd."  
  83. }  
Our code will deserialize this JSON data into an object named UserInfo.

User details page will look like the following one.
 
 
  
As the source code is larger than the upload limit, it is first compressed using the 7-Zip compressor and then it is zipped. Please first unzip and then decompress using the 7-Zip software.

For any queries and feedback, please write in the comment box. In coming articles, I will demonstrate how to integrate "Login using Gmail" and "Login using Facebook".