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")); }