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