public ActionResult ExternalLoginCallback(string returnUrl)
        {
            string callbackUrl = this.Url.Action("ExternalLoginCallback", new { ReturnUrl = returnUrl });
            var    result      = OAuthWebSecurity.VerifyAuthentication(callbackUrl);

            if (!result.IsSuccessful)
            {
                return(this.RedirectToAction("ExternalLoginFailure"));
            }

            if (OAuthWebSecurity.Login(result.Provider, result.ProviderUserId, this.Config.CreatePersistentCookie))
            {
                string username = OAuthWebSecurity.GetUserName(result.Provider, result.ProviderUserId);
                return(this.PostSuccessfulLogin(username, returnUrl));
            }

            if (this.User.Identity.IsAuthenticated)
            {
                // If the current user is logged in add the new account
                OAuthWebSecurity.CreateOrUpdateAccount(result.Provider, result.ProviderUserId, this.User.Identity.Name);
                string username = OAuthWebSecurity.GetUserName(result.Provider, result.ProviderUserId);
                return(this.PostSuccessfulLogin(username, returnUrl));
            }
            else
            {
                // User is new, ask for their desired membership name
                string loginData = OAuthWebSecurity.SerializeProviderUserId(result.Provider, result.ProviderUserId);
                this.ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(result.Provider).DisplayName;
                this.ViewBag.ReturnUrl           = returnUrl;

                var registrationModel = new ExternalLoginRegistrationModel <TUserProfileViewModel>
                {
                    UserProfileViewModel = new TUserProfileViewModel(),
                    ExternalLoginData    = loginData
                };
                registrationModel.UserProfileViewModel.Username = result.UserName;

                return(this.View("ExternalLoginConfirmation", registrationModel));
            }
        }
        public ActionResult ExternalLoginConfirmation(ExternalLoginRegistrationModel <TUserProfileViewModel> registrationModel, string returnUrl)
        {
            string provider       = null;
            string providerUserId = null;

            if (this.User.Identity.IsAuthenticated ||
                !OAuthWebSecurity.TryDeserializeProviderUserId(registrationModel.ExternalLoginData, out provider, out providerUserId))
            {
                return(this.RedirectToAction("Manage"));
            }

            if (this.ModelState.IsValid)
            {
                //// Insert a new user into the database

                var profile = this.Repository.GetByUsername(registrationModel.UserProfileViewModel.Username);

                // Check if user already exists
                if (profile == null)
                {
                    profile = this.CreateUserProfile(registrationModel.UserProfileViewModel);

                    OAuthWebSecurity.CreateOrUpdateAccount(provider, providerUserId, profile.Username);
                    OAuthWebSecurity.Login(provider, providerUserId, createPersistentCookie: false);

                    return(this.PostSuccessfulLogin(profile.Username, returnUrl));
                }
                else
                {
                    this.ModelState.AddModelError(
                        Of <TUserProfileViewModel> .CodeNameFor(m => m.Username),
                        "User name already exists. Please enter a different user name.");
                }
            }

            this.ViewBag.ProviderDisplayName = OAuthWebSecurity.GetOAuthClientData(provider).DisplayName;
            this.ViewBag.ReturnUrl           = returnUrl;
            return(this.View(registrationModel));
        }