protected override void OnInitialized() { var uri = this.Navigation.ToAbsoluteUri(this.Navigation.Uri); if (!string.IsNullOrWhiteSpace(uri.Query)) { var queryMap = QueryHelpers.ParseQuery(uri.Query); if (queryMap.TryGetValue("result", out var encodedIdentityResult)) { this.result = IdentityResultEncoder.Base64UrlDecode(encodedIdentityResult.ToString()); } } }
public async Task <IActionResult> Confirm(string userId, string code) { string encodedResult; var user = await userManager.FindByIdAsync(userId); if (user != null) { code = Encoding.UTF8.GetString(WebEncoders.Base64UrlDecode(code)); var identityResult = await userManager.ConfirmEmailAsync(user, code); foreach (var error in identityResult.Errors) { logger.LogError(error.Description); } encodedResult = IdentityResultEncoder.Base64UrlEncode(identityResult); return(this.Redirect($"~/identity/confirm?result={encodedResult}")); } logger.LogWarning($"Confirm email skipped. User {userId} not found."); encodedResult = IdentityResultEncoder.Base64UrlEncode(IdentityResult.Failed()); return(this.Redirect($"~/identity/confirm?result={encodedResult}")); }
public async Task <IActionResult> ConfirmExternal(string returnUrl = null, string remoteError = null) { var redirectUrl = returnUrl ?? this.Url.Content("~/"); string encodedResult = string.Empty; if (remoteError != null) { encodedResult = IdentityResultEncoder.Base64UrlEncode(IdentityResult.Failed(new IdentityError() { Description = string.Format(IdentityUIResources.SignInWithAttemptFailedRemoteError, remoteError) })); return(this.Redirect($"~/identity/confirmExternal?result={encodedResult}&returnUrl={returnUrl}")); } var info = await signInManager.GetExternalLoginInfoAsync(); if (info == null) { encodedResult = IdentityResultEncoder.Base64UrlEncode(IdentityResult.Failed(new IdentityError() { Description = IdentityUIResources.SignInWithAttemptFailed })); return(this.Redirect($"~/identity/confirmExternal?result={encodedResult}&returnUrl={returnUrl}")); } // Sign in the user with this external login provider if the user already has a login. var signInResult = await signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent : true, bypassTwoFactor : true); if (signInResult.Succeeded) { logger.LogInformation("{Name} logged in with {LoginProvider} provider.", info.Principal.Identity.Name, info.LoginProvider); return(this.LocalRedirect(redirectUrl)); } if (signInResult.IsLockedOut) { encodedResult = IdentityResultEncoder.Base64UrlEncode(IdentityResult.Failed(new IdentityError() { Description = IdentityResources.UserLockedOut })); return(this.Redirect($"~/identity/confirmExternal?result={encodedResult}&returnUrl={returnUrl}")); } if (!info.Principal.HasClaim(c => c.Type == ClaimTypes.Email)) { encodedResult = IdentityResultEncoder.Base64UrlEncode(IdentityResult.Failed(new IdentityError() { Description = IdentityUIResources.SignInWithAttemptFailedNotEnoughPermissions })); return(this.Redirect($"~/identity/confirmExternal?result={encodedResult}&returnUrl={returnUrl}")); } if (this.participantsService == null) { encodedResult = IdentityResultEncoder.Base64UrlEncode(IdentityResult.Failed(new IdentityError() { Description = IdentityUIResources.SignInWithAttemptFailed })); return(this.Redirect($"~/identity/confirmExternal?result={encodedResult}&returnUrl={returnUrl}")); } var email = info.Principal.FindFirstValue(ClaimTypes.Email); var user = new IdentityUser { UserName = email, Email = email, EmailConfirmed = true }; var identityResult = await userManager.CreateAsync(user); if (identityResult.Succeeded) { identityResult = await userManager.AddLoginAsync(user, info); if (identityResult.Succeeded) { logger.LogInformation("User created an account using {Name} provider.", info.LoginProvider); await signInManager.SignInAsync(user, isPersistent : false, info.LoginProvider); var avatarUrl = info.Principal.FindFirstValue("avatar"); await this.participantsService.ChangeInfo(Guid.Parse(user.Id), info.Principal.Identity.Name, avatarUrl); return(this.LocalRedirect(redirectUrl)); } } foreach (var error in identityResult.Errors) { logger.LogError(error.Description); } encodedResult = IdentityResultEncoder.Base64UrlEncode(identityResult); return(this.Redirect($"~/identity/confirmExternal?result={encodedResult}&returnUrl={returnUrl}")); }