Esempio n. 1
0
        public virtual async Task <IActionResult> SignUpExternal([FromBody][Required] SignupExternal signupExternal, CancellationToken cancellationToken = default)
        {
            var user = await this.SecurityManager
                       .SignUpExternalAsync(signupExternal, cancellationToken);

            return(this.Created("Signup", user));
        }
Esempio n. 2
0
        /// <summary>
        /// Signs in a user, using an external login provider.
        /// This method should be invoked after getting callback response from external login provider.
        /// </summary>
        /// <param name="loginExternalCallback">The <see cref="LoginExternalCallback"/>.</param>
        /// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
        /// <returns>The <see cref="AccessToken"/>.</returns>
        public virtual async Task <AccessToken> SignInExternalAsync(LoginExternalCallback loginExternalCallback, CancellationToken cancellationToken = default)
        {
            if (loginExternalCallback == null)
            {
                throw new ArgumentNullException(nameof(loginExternalCallback));
            }

            if (loginExternalCallback.RemoteError != null)
            {
                throw new UnauthorizedAccessException(loginExternalCallback.RemoteError);
            }

            var externalLoginInfo = await this.SignInManager
                                    .GetExternalLoginInfoAsync();

            if (externalLoginInfo == null)
            {
                throw new NullReferenceException(nameof(externalLoginInfo));
            }

            var result = await this.SignInManager
                         .ExternalLoginSignInAsync(externalLoginInfo.LoginProvider, externalLoginInfo.ProviderKey, false, true);

            IdentityUser user;

            if (result.Succeeded)
            {
                user = await this.UserManager
                       .FindByLoginAsync(externalLoginInfo.LoginProvider, externalLoginInfo.ProviderKey);

                return(await this.UserManager
                       .GenerateJwtToken(user, this.Options));
            }

            if (result.IsLockedOut)
            {
                throw new UnauthorizedLockoutException();
            }

            var emailClaim = externalLoginInfo.Principal.Claims
                             .FirstOrDefault(x => x.Type == ClaimTypes.Email);

            if (emailClaim == null)
            {
                throw new UnauthorizedEmailException();
            }

            var signupExternal = new SignupExternal
            {
                Username = emailClaim.Value,
                Email    = emailClaim.Value
            };

            user = await this.SignUpExternalAsync(signupExternal, cancellationToken);

            return(await this.UserManager
                   .GenerateJwtToken(user, this.Options));
        }
Esempio n. 3
0
        /// <summary>
        /// Completes a sign-up after successfull external logn.
        /// The user is created and linked to the external login provider.
        /// </summary>
        /// <param name="signupExternal">The <see cref="SignupExternal"/>.</param>
        /// <param name="cancellationToken">The <see cref="CancellationToken"/>.</param>
        /// <returns>The <see cref="IdentityUser"/>.</returns>
        public virtual async Task <IdentityUser> SignUpExternalAsync(SignupExternal signupExternal, CancellationToken cancellationToken = default)
        {
            if (signupExternal == null)
            {
                throw new ArgumentNullException(nameof(signupExternal));
            }

            var externalLoginInfo = await this.SignInManager
                                    .GetExternalLoginInfoAsync();

            if (externalLoginInfo == null)
            {
                throw new NullReferenceException(nameof(externalLoginInfo));
            }

            var user = new IdentityUser
            {
                UserName = signupExternal.Username,
                Email    = signupExternal.Email
            };

            var result = await this.UserManager
                         .CreateAsync(user);

            if (!result.Succeeded)
            {
                this.ThrowErrors(result.Errors);
            }

            result = await this.UserManager
                     .AddLoginAsync(user, externalLoginInfo);

            if (!result.Succeeded)
            {
                this.ThrowErrors(result.Errors);
            }

            return(user);
        }