protected virtual async Task <AuthenticateResult> UpdateAccountFromExternalClaimsAsync(TKey userID, string provider, string providerId, IEnumerable <Claim> claims)
        {
            var existingClaims = await userManager.GetClaimsAsync(userID);

            var intersection = existingClaims.Intersect(claims, new ClaimComparer());
            var newClaims    = claims.Except(intersection, new ClaimComparer());

            foreach (var claim in newClaims)
            {
                var result = await userManager.AddClaimAsync(userID, claim);

                if (!result.Succeeded)
                {
                    return(new AuthenticateResult(result.Errors.First()));
                }
            }

            return(null);
        }
        protected virtual async Task <AuthenticateResult> UpdateAccountFromExternalClaimsAsync(TUser user, string provider, string providerId, IEnumerable <Claim> claims)
        {
            var existingClaims = await _userManager.GetClaimsAsync(user).ConfigureAwait(false);

            var intersection = existingClaims.Intersect(claims, new ClaimComparer());
            var newClaims    = claims.Except(intersection, new ClaimComparer());

            foreach (var claim in newClaims)
            {
                var result = await _userManager.AddClaimAsync(user, claim).ConfigureAwait(false);

                if (!result.Succeeded)
                {
                    return(new AuthenticateResult($"{result.Errors.First().Code}-{result.Errors.First().Description}"));
                }
            }

            return(null);
        }