public async Task <IActionResult> ExternalVerifyMembership(ExternalVerifyViewModel model, string returnUrl = null) { if (ModelState.IsValid) { // Get the information about the user from the external login provider var info = await signin.GetExternalLoginInfoAsync(); if (info == null) { throw new ApplicationException("Error loading external login information during confirmation."); } var codeRow = await db.ExternalLoginCodes.FindAsync(info.ProviderKey); bool success = await VerifyMembership(codeRow, info, model); if (success) { return(RedirectToLocal(returnUrl)); } } return(View("ExternalVerify")); }
private async Task <bool> VerifyMembership(ExternalLoginCode codeRow, ExternalLoginInfo info, ExternalVerifyViewModel model) { if (codeRow == null) { AddErrors(IdentityResult.Failed(new IdentityError { Code = "NoMembershipCode", Description = "Invalid or unknown code." })); return(false); } if (string.Compare(codeRow.Code, model.Code, true) != 0) { AddErrors(IdentityResult.Failed(new IdentityError { Code = "MembershipCodeInvalid", Description = "Invalid or unknown code." })); return(false); } if (codeRow.ExpiresUtc < DateTime.UtcNow) { AddErrors(IdentityResult.Failed(new IdentityError { Code = "MembershipCodeExpired", Description = "Code is expired." })); return(false); } var member = await remoteMembers.GetMember(codeRow.MemberId); if (member == null) { AddErrors(IdentityResult.Failed(new IdentityError { Code = "MembershipCodeInvalid", Description = "Invalid or unknown code." })); return(false); } IdentityResult result; var user = await users.FindByMemberId(member.Id); if (user == null) { string nameSpacer = (string.IsNullOrEmpty(member.LastName) || string.IsNullOrEmpty(member.FirstName)) ? string.Empty : " "; user = new ApplicationUser { UserName = $"@{member.Id}-{info.LoginProvider}", Email = member.PrimaryEmail, MemberId = member.Id, PhoneNumber = member.PrimaryPhone, FirstName = member.FirstName, LastName = member.LastName, Created = DateTimeOffset.UtcNow }; result = await users.CreateAsync(user); if (!result.Succeeded) { AddErrors(result); return(false); } logger.LogInformation($"User created for {member.FirstName} {member.LastName}. Will link to {info.ProviderDisplayName} login."); } info.ProviderDisplayName += " - " + (info.Principal.FindFirstValue(ClaimTypes.Email) ?? "unknown"); result = await users.AddLoginAsync(user, info); if (!result.Succeeded) { AddErrors(result); return(false); } await signin.SignInAsync(user, isPersistent : false); logger.LogInformation($"Associated {info.ProviderDisplayName} login with account {user.Id} ({user.UserName} {user.Email})"); return(true); }