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());
                }
            }
        }
Exemplo n.º 2
0
        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}"));
        }
Exemplo n.º 3
0
        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}"));
        }