/// <summary>
        /// Handle sign-in with LinkedIn.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        private LinkedInSignInViewModel HandleLinkedInSignIn(LinkedInSignInRequest request)
        {
            var viewModel = new LinkedInSignInViewModel();

            if (SitefinityHelper.IsUserLoggedIn())
            {
                return(viewModel);
            }

            if (!LinkedInHelper.IsValidState(request.State))
            {
                viewModel.Error = "The response from LinkedIn is in invalid state. Please go back and try again.";

                return(viewModel);
            }

            var redirectUrl = LinkedInHelper.CreateSignInRedirectUrl(request.Redirect, request.Data);

            try
            {
                var accessTokenResponse = LinkedInHelper.GetAccessTokenFromAuthorisationCode(request.Code, redirectUrl);

                if (string.IsNullOrEmpty(accessTokenResponse.Error))
                {
                    if (!CreateUserFromLinkedInProfileData(accessTokenResponse.AccessToken))
                    {
                        viewModel.Error = "There was some problem while sign-in. Please go back and try again.";
                    }
                }
                else
                {
                    viewModel.Error = accessTokenResponse.Error;
                }
            }
            catch (Exception err)
            {
                viewModel.Error = "There was some problem during authentication with LinkedIn. Please go back and try again.";

                Log.Write(err);
            }

            return(viewModel);
        }
        /// <summary>
        /// Action to handle LinkedIn sign-in.
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult LinkedInSignIn(LinkedInSignInRequest request)
        {
            LinkedInSignInViewModel viewModel;
            string urlReferral = null;

            if (TempData["source"] != null)
            {
                urlReferral = TempData["source"].ToString();
            }

            if (string.IsNullOrEmpty(request.Error))
            {
                viewModel = HandleLinkedInSignIn(request);

                if (viewModel.Error == null)
                {
                    TempData["Urlreferal"] = urlReferral;

                    // try to redirect to the last page
                    if (!string.IsNullOrWhiteSpace(request.Redirect))
                    {
                        if (request.Redirect == LinkedInHelper.ActionJobApply)
                        {
                            if (int.TryParse(request.Data, out int jobId))
                            {
                                return(Redirect(GetJobApplicationUrl(jobId, "ShowLinkedIn=1")));
                            }
                        }
                        else
                        {
                            var uriBuilder = new UriBuilder(request.Redirect);

                            var query = HttpUtility.ParseQueryString(uriBuilder.Query);
                            query["ShowLinkedIn"] = "1";

                            uriBuilder.Query = query.ToString();

                            return(Redirect(uriBuilder.ToString()));
                        }
                    }

                    // redirect to home page
                    return(Redirect("/"));
                }
            }
            else
            {
                if (request.Error == "user_cancelled_login" || request.Error == "user_cancelled_authorize")
                {
                    // try to redirect to the last page.
                    if (!string.IsNullOrWhiteSpace(request.Redirect))
                    {
                        TempData["Urlreferal"] = urlReferral;

                        if (request.Redirect == LinkedInHelper.ActionJobApply)
                        {
                            if (int.TryParse(request.Data, out int jobId))
                            {
                                return(Redirect(GetJobApplicationUrl(jobId)));
                            }
                        }
                        else
                        {
                            return(Redirect(request.Redirect));
                        }
                    }
                }

                viewModel = new LinkedInSignInViewModel
                {
                    Error = request.ErrorDescription ?? Request.QueryString.Get("error_description")
                };
            }

            // set the back url based on the action.
            // this will handle the unexpected errors.
            if (request.Redirect == LinkedInHelper.ActionJobApply)
            {
                if (int.TryParse(request.Data, out int jobId))
                {
                    viewModel.BackUrl = GetJobApplicationUrl(jobId);
                }
            }

            return(View(viewModel));
        }