ExternalLoginHandler( ExternalLoginHandlerViewModel model, ModelMethodContext context) { if (!context.ModelState.IsValid) { return; } var newUser = CreateUserFromRegistration(model); var result = _userManager.Create(newUser); if (result.Succeeded) { var loginInfo = _context.GetOwinContext().Authentication .GetExternalLoginInfo(); if (loginInfo == null) { ExternalLoginFailRedirect(); return; } result = _userManager.AddLogin(newUser.Id, loginInfo.Login); if (result.Succeeded) { // Microsoft's default approach does not validate the user's // email address, deferring the authentication to the // third-party provider. // // SignIn(user, isPersistent: false); // RedirectToLocal(); RegisterNewUser(newUser); return; } } AddErrors(result, context); }
GetExternalLoginHandler(ModelMethodContext context) { var model = new ExternalLoginHandlerViewModel { ProviderName = StateContext.Data[ProviderNameKey] as string }; // Check that a Provider is specified if (String.IsNullOrWhiteSpace(model.ProviderName)) { ExternalLoginFailRedirect(); return(null); } var loginInfo = _authenticationManager.GetExternalLoginInfo(); if (loginInfo == null) { ExternalLoginFailRedirect(); return(null); } var signInStatus = ExternalSignIn(loginInfo, false); switch (signInStatus) { case SignInStatus.Success: RedirectToLocal(); return(null); case SignInStatus.NotVerified: var user = _userManager.Find(loginInfo.Login); SendEmailVerificationCode(user, reminder: true); return(null); case SignInStatus.LockedOut: StateController.Navigate("AccountLocked"); return(null); case SignInStatus.RequiresTwoFactorAuthentication: StateController.Navigate( "SendTwoFactorCode", new NavigationData { { ReturnUrlKey, StateContext.Data[ReturnUrlKey] } }); return(null); } if (_context.User.Identity.IsAuthenticated) { // Apply Xsrf check when linking var userId = _context.User.Identity.GetUserId(); var verifiedloginInfo = _authenticationManager .GetExternalLoginInfo(XsrfKey, userId); if (verifiedloginInfo == null) { ExternalLoginFailRedirect(); return(null); } var result = _userManager.AddLogin(userId, verifiedloginInfo.Login); if (result.Succeeded) { RedirectToLocal(); return(null); } AddErrors(result, context); } else { // It's a new account, so get additional local details model.UserName = loginInfo.DefaultUserName; model.Email = loginInfo.Email; } return(model); }