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