public async Task <IActionResult> Activate(string id)
        {
            if (string.IsNullOrEmpty(id))
            {
                throw new InvalidOperationException();
            }

            var user = await _userManager.FindByIdAsync(id);

            if (user == null)
            {
                throw new InvalidOperationException();
            }

            if (user.MigrationStatus == (int)MigrationStatus.NotMigrated)
            {
                throw new InvalidOperationException();
            }

            await _graphService.SetUserActivationStatusAsync(user.UserName, "Pending");

            var userClaims = await _userManager.GetClaimsAsync(user);

            var displayNameClaim = userClaims.First(c => c.Type == WingTipClaimTypes.DisplayNameClaimType);
            var nonce            = _passwordGenerator.GeneratePassword();
            var redeemUrl        = GenerateSignedRedeemUrl(user.UserName, nonce);

            _smtpService.SendActivationEmail(user.UserName, displayNameClaim.Value, redeemUrl);
            var existingNonceClaim = userClaims.FirstOrDefault(c => c.Type == WingTipClaimTypes.NonceClaimType);

            if (existingNonceClaim != null)
            {
                var removeClaimResult = await _userManager.RemoveClaimAsync(user, existingNonceClaim);

                if (!removeClaimResult.Succeeded)
                {
                    throw new InvalidOperationException(removeClaimResult.Errors.ToString());
                }
            }

            var newNonceClaim  = new Claim(WingTipClaimTypes.NonceClaimType, nonce);
            var addClaimResult = await _userManager.AddClaimAsync(user, newNonceClaim);

            if (!addClaimResult.Succeeded)
            {
                throw new InvalidOperationException(addClaimResult.Errors.ToString());
            }

            return(RedirectToAction("Index"));
        }