public async Task <ActionResult> LoginLinkedIn(string state, string code) { if (!String.IsNullOrEmpty(Request.QueryString?["error"])) { string errorMessage = $"{Request.QueryString?["error"]} {Request.QueryString?["error_description"]}"; Trace.TraceWarning($"Login failed: Invalid login request from LinkedIn sign in. {errorMessage}"); return(RedirectToAction("ExternalLoginFailure")); } if (String.IsNullOrEmpty(state) || String.IsNullOrEmpty(code)) { Trace.TraceWarning($"Login failed: Improper state or code provided. state: {state}, code: {code}"); return(RedirectToAction("ExternalLoginFailure")); } string returnUrl = _stateCache.Value.Get(state) as string; if (returnUrl == null) { Trace.TraceWarning($"Login failed: Failed to retreive login state from database. state: {state}, code: {code}"); return(RedirectToAction("ExternalLoginFailure")); } try { IncomingApiDataResponse <LinkedInTokenResponse> tokenResponse = await LinkedInApiService.GetToken(LocalRedirectUrl, code).ConfigureAwait(false); LinkedInUser user = await _userService.InitializeUserFromLinkedIn(tokenResponse.Data).ConfigureAwait(false); List <Claim> claims = new List <Claim>() { new Claim(ClaimTypes.Name, $"{user.User.FirstName} {user.User.LastName}"), new Claim(ClaimTypes.Email, user.User.Email), new Claim(ClaimTypes.NameIdentifier, user.LinkedInId), new Claim(AppConstants.CustomClaims.IsdUserId, user.Id.ToString()) }; if (!String.IsNullOrEmpty(user.ProfileImageUrl)) { claims.Add(new Claim(AppConstants.CustomClaims.UserImageUrl, user.ProfileImageUrl)); } ClaimsIdentity identity = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie); IOwinContext authContext = Request.GetOwinContext(); authContext.Authentication.SignIn(new AuthenticationProperties { IsPersistent = true, ExpiresUtc = DateTime.UtcNow.AddSeconds(tokenResponse.Data.expires_in) }, identity); return(RedirectToLocal(returnUrl)); } catch (LinkedInApiResponseException ex) { Trace.TraceError(ex.ToString(), ex); return(RedirectToAction("ExternalLoginFailure")); } }
public async Task <LinkedInUser> InitializeUserFromLinkedIn(LinkedInTokenResponse token) { LinkedInApiService api = new LinkedInApiService(token.access_token); IncomingApiDataResponse <LinkedInPersonResponse> personResponse = await api.GetPerson(token.access_token).ConfigureAwait(false); LinkedInUser linkedInUser = (await _uow.LinkedInUserRepository.GetAsync(lu => lu.LinkedInId == personResponse.Data.id).ConfigureAwait(false)).FirstOrDefault(); if (linkedInUser == null) { linkedInUser = new LinkedInUser { LinkedInId = personResponse.Data.id, }; User user = new User(); _uow.UserRepository.Insert(user); linkedInUser.User = user; _uow.LinkedInUserRepository.Insert(linkedInUser); } linkedInUser.ProfileImageUrl = personResponse.Data.pictureUrl; linkedInUser.ProfileRequestUrl = personResponse.Data.publicProfileUrl; linkedInUser.Token = token.access_token; linkedInUser.TokenExpires = DateTime.UtcNow.AddSeconds(token.expires_in); linkedInUser.User.Email = personResponse.Data.emailAddress; linkedInUser.User.FirstName = personResponse.Data.firstName; linkedInUser.User.LastName = personResponse.Data.lastname; linkedInUser.User.ImageUrl = personResponse.Data.pictureUrl; if (String.IsNullOrEmpty(linkedInUser.User.Username) && !String.IsNullOrEmpty(personResponse.Data.emailAddress) && (await _uow.UserRepository.GetAsync(u => u.Username == personResponse.Data.emailAddress).ConfigureAwait(false)) == null) { linkedInUser.User.Username = personResponse.Data.emailAddress; } else { linkedInUser.User.Username = linkedInUser.LinkedInId; } await _uow.SaveChangesAsync().ConfigureAwait(false); return(linkedInUser); }