Beispiel #1
0
        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"));
        }
Beispiel #2
0
        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);
        }