Esempio n. 1
0
        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"));
            }
        }
Esempio n. 2
0
        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);
        }