// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. using System; using System.Globalization; using System.Security.Claims; using Microsoft.Owin; using Microsoft.Owin.Security; using Microsoft.Owin.Security.Provider; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Owin.Security.Providers.LinkedIn { /// /// Contains information about the login session as well as the user . /// public class LinkedInAuthenticatedContext : BaseContext { /// /// Initializes a /// /// The OWIN environment /// The JSON-serialized user /// LinkedIn Access token /// Seconds until expiration public LinkedInAuthenticatedContext(IOwinContext context, JObject user, string accessToken, string expires) : base(context) { this.User = user; this.AccessToken = accessToken; int expiresValue; if (int.TryParse(expires, NumberStyles.Integer, CultureInfo.InvariantCulture, out expiresValue)) { this.ExpiresIn = TimeSpan.FromSeconds(expiresValue); } this.Id = TryGetValue(user, "id"); this.FamilyName = TryGetLocalizedValue(user, "lastName"); this.GivenName = TryGetLocalizedValue(user, "firstName"); if (this.FamilyName != null || this.GivenName != null) { this.Name = string.Join(" ", this.GivenName, this.FamilyName); } } /// /// Initializes a /// /// The OWIN environment /// The JSON-serialized user /// LinkedIn Access token /// Seconds until expiration /// User email returned from dedicated endpoint public LinkedInAuthenticatedContext(IOwinContext context, JObject user, string accessToken, string expires, string email) : this(context, user, accessToken, expires) { this.Email = email; } /// /// Gets the JSON-serialized user /// /// /// Contains the LinkedIn user obtained from the endpoint https://api.linkedin.com/v1/people/~ /// public JObject User { get; private set; } /// /// Gets the LinkedIn access token /// public string AccessToken { get; private set; } /// /// Gets the LinkedIn access token expiration time /// public TimeSpan? ExpiresIn { get; set; } /// /// Gets the LinkedIn user ID /// public string Id { get; private set; } /// /// Gets the user's name /// public string Name { get; private set; } /// /// Gets the LinkedIn username /// [Obsolete("LinkedIn doesn't return a username claim. Use Name instead.")] public string UserName { get; private set; } /// /// Get the user's first name /// public string GivenName { get; private set; } /// /// Get the user's last name /// public string FamilyName { get; private set; } /// /// Describes the users membership profile /// [Obsolete("LinkedIn doesn't return this claim anymore.")] public string Summary { get; private set; } /// /// Industry the member belongs to /// https://developer.linkedin.com/docs/reference/industry-codes /// [Obsolete("LinkedIn doesn't return this claim anymore.")] public string Industry { get; set; } /// /// The members headline /// [Obsolete("LinkedIn doesn't return this claim anymore.")] public string Headline { get; set; } /// /// Member's current positions /// https://developer.linkedin.com/docs/fields/positions /// [Obsolete("LinkedIn doesn't return this claim anymore.")] public string Positions { get; set; } [Obsolete("LinkedIn doesn't return this claim anymore.")] public string Link { get; private set; } /// /// Gets the LinkedIn email /// public string Email { get; private set; } /// /// Gets the representing the user /// public ClaimsIdentity Identity { get; set; } /// /// Gets or sets a property bag for common authentication properties /// public AuthenticationProperties Properties { get; set; } private static string TryGetValue(JObject user, string propertyName) { JToken value; return user.TryGetValue(propertyName, out value) ? value.ToString() : null; } private static string TryGetValueAndSerialize(JObject user, string propertyName) { JToken value; return user.TryGetValue(propertyName, out value) ? JsonConvert.SerializeObject(value) : null; } private static string TryGetLocalizedValue(JObject container, string propertyName) { var localizedValues = container.SelectToken(propertyName + ".localized") as JObject; if (localizedValues == null) { return null; } var defaultValue = TryGetValue(localizedValues, "en-US"); if (defaultValue != null) { return defaultValue; } if (localizedValues.HasValues) { return localizedValues.First.First.Value(); } return null; } } }