Beispiel #1
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));
        }
Beispiel #2
0
        public virtual async Task <IActionResult> LoginExternalCallback([FromBody][Required] LoginExternalCallback loginExternalCallback, CancellationToken cancellationToken = default)
        {
            try
            {
                var accessToken = await this.SecurityManager
                                  .SignInExternalAsync(loginExternalCallback, cancellationToken);

                return(this.Ok(accessToken));
            }
            catch
            {
                return(this.Unauthorized());
            }
        }