/// <summary>
        /// Add a Login to an existing user.
        /// </summary>
        /// <param name="request">Instance of AddLoginRequest</param>
        /// <returns>Instance of AddLoginResponse</returns>
        public async Task <AddLoginResponse> AddLoginAsync(AddLoginRequest request)
        {
            AddLoginResponse response = new AddLoginResponse();

            try
            {
                IdentityResult result = await this.UserManager.AddLoginAsync(request.UserId.ToString(), new UserLoginInfo(request.LoginProvider, request.ProviderKey));

                if (!result.Succeeded)
                {
                    response.AddErrors(result.Errors);
                    response.Success = false;
                }
                else
                {
                    response.Success = true;
                }
            }
            catch (Exception e)
            {
                response.Success = false;
                response.Errors.Add(e.Message);
            }

            return(response);
        }
        /// <summary>
        /// Add a Login to an existing user. 
        /// </summary>
        /// <param name="request">Instance of AddLoginRequest</param>
        /// <returns>Instance of AddLoginResponse</returns>
        public async Task<AddLoginResponse> AddLoginAsync(AddLoginRequest request)
        {
            AddLoginResponse response = new AddLoginResponse();

            try
            {
                IdentityResult result = await this.UserManager.AddLoginAsync(request.UserId.ToString(), new UserLoginInfo(request.LoginProvider, request.ProviderKey));

                if (!result.Succeeded)
                {
                    response.AddErrors(result.Errors);
                    response.Success = false;
                }
                else
                {
                    response.Success = true;
                }

            }
            catch (Exception e)
            {
                response.Success = false;
                response.Errors.Add(e.Message);
            }

            return response;
        }
        public async Task <ActionResult> ExternalLoginConfirmation(ExternalLoginConfirmationViewModel model, string returnUrl)
        {
            if (User.Identity.IsAuthenticated)
            {
                return(RedirectToAction("Manage"));
            }

            if (ModelState.IsValid)
            {
                // Get the information about the user from the external login provider
                var info = await AuthenticationManager.GetExternalLoginInfoAsync();

                if (info == null)
                {
                    return(View("ExternalLoginFailure"));
                }

                CreateResponse createResponse = await this.Membership.CreateAsync(new CreateRequest()
                {
                    UserName = model.UserName
                });

                if (createResponse.Success)
                {
                    AddLoginResponse addLoginResponse = await this.Membership.AddLoginAsync(new AddLoginRequest()
                    {
                        UserId        = new Guid(createResponse.UserId.ToString()),
                        LoginProvider = info.Login.LoginProvider,
                        ProviderKey   = info.Login.ProviderKey
                    });

                    if (addLoginResponse.Success)
                    {
                        ClaimsIdentity identity = createResponse.ClaimIdentity.ConvertToClaimsIdentity();
                        SignInAsync(identity, IsPersistent: false);
                        return(RedirectToLocal(returnUrl));
                    }
                    else
                    {
                        AddErrors(addLoginResponse.Errors);
                    }
                }

                AddErrors(createResponse.Errors);
            }

            ViewBag.ReturnUrl = returnUrl;
            return(View(model));
        }
        //
        // GET: /Account/LinkLoginCallback
        public async Task <ActionResult> LinkLoginCallback()
        {
            var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(XsrfKey, User.Identity.GetUserId());

            if (loginInfo == null)
            {
                return(RedirectToAction("Manage", new { Message = ManageMessageId.Error }));
            }

            AddLoginResponse response = await this.Membership.AddLoginAsync(new AddLoginRequest()
            {
                UserId        = new Guid(User.Identity.GetUserId()),
                LoginProvider = loginInfo.Login.LoginProvider,
                ProviderKey   = loginInfo.Login.ProviderKey,
            });

            if (response.Success)
            {
                return(RedirectToAction("Manage"));
            }

            return(RedirectToAction("Manage", new { Message = ManageMessageId.Error }));
        }