Example #1
0
        public virtual async Task <IActionResult> SignUpExternalAsync([FromBody][Required] SignUpExternal <TEntity, TIdentity> signUpExternal, CancellationToken cancellationToken = default)
        {
            var identityUser = await this.IdentityManager
                               .SignUpExternalAsync(signUpExternal, cancellationToken);

            signUpExternal.User.Id             = identityUser.Id.Parse <TIdentity>();
            signUpExternal.User.IdentityUserId = identityUser.Id;

            TEntity user;

            try
            {
                user = await this.Repository
                       .AddAsync(signUpExternal.User, cancellationToken);

                await this.Repository
                .SaveChanges(cancellationToken);
            }
            catch
            {
                await this.IdentityManager
                .DeleteIdentityUser(identityUser, cancellationToken);

                await this.Repository
                .SaveChanges(cancellationToken);

                throw;
            }

            user.IdentityUser = identityUser;

            return(this.Created("signup/external", user));
        }
Example #2
0
        public virtual async Task <IActionResult> SignUpExternalAsync([FromBody][Required] SignUpExternal <TEntity> signUpExternal, CancellationToken cancellationToken = default)
        {
            var identityUser = await this.IdentityManager
                               .SignUpExternalAsync(signUpExternal, cancellationToken);

            signUpExternal.User.Id             = Guid.Parse(identityUser.Id);
            signUpExternal.User.IdentityUserId = identityUser.Id;

            var result = await this.Repository
                         .AddAsync(signUpExternal.User, cancellationToken);

            result.IdentityUser = identityUser;

            return(this.Created("signup/external", result));
        }
Example #3
0
        public virtual async Task <IActionResult> SignUpExternalChallangeCallbackAsync([FromQuery] string remoteError = null, CancellationToken cancellationToken = default)
        {
            if (remoteError != null)
            {
                throw new UnauthorizedException(remoteError);
            }

            var signUpExternalResponse = await this.IdentityManager
                                         .SignInExternalChallangeCallbackAsync(cancellationToken);

            var signUpExternal = new SignUpExternal
            {
                EmailAddress = signUpExternalResponse.Email
            };

            var identityUser = await this.IdentityManager
                               .SignUpExternalAsync(signUpExternal, cancellationToken);

            var userId = Guid.Parse(identityUser.Id);
            var user   = await this.Repository
                         .GetAsync <TEntity>(userId, cancellationToken);

            if (user == null)
            {
                user = new TEntity
                {
                    Id             = userId,
                    IdentityUserId = identityUser.Id
                };

                var result = await this.Repository
                             .AddAsync(user, cancellationToken);

                result.IdentityUser = identityUser;

                return(this.Created("external/challange/callback", result));
            }

            return(this.Ok(user));
        }
Example #4
0
        /// <summary>
        /// Registers a new user using an 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 identityUser = new IdentityUser
            {
                Email    = signUpExternal.EmailAddress,
                UserName = signUpExternal.EmailAddress
            };

            var createResult = await this.UserManager
                               .CreateAsync(identityUser);

            if (!createResult.Succeeded)
            {
                this.ThrowIdentityExceptions(createResult.Errors);
            }

            var addLoginResult = await this.UserManager
                                 .AddLoginAsync(identityUser, new UserLoginInfo(signUpExternal.ExternalLogin.LoginProvider, signUpExternal.ExternalLogin.ProviderKey, signUpExternal.ExternalLogin.LoginProvider));

            if (!addLoginResult.Succeeded)
            {
                this.ThrowIdentityExceptions(createResult.Errors);
            }

            await this.UserManager
            .AddToRolesAsync(identityUser, this.Options.User.DefaultRoles);

            await this.SignInManager
            .SignInAsync(identityUser, signUpExternal.ExternalLogin.IsRememerMe);

            return(identityUser);
        }