public IEnumerable<Claim> Filter(IdentityProvider provider, IEnumerable<Claim> claims)
        {
            claims = NormalizeExternalClaimTypes(claims);

            claims = TransformSocialClaims(provider, claims);

            return claims;
        }
        protected virtual IEnumerable<Claim> TransformSocialClaims(IdentityProvider provider, IEnumerable<Claim> claims)
        {
            if (provider.Name == FacebookProviderName)
            {
                claims = TransformFacebookClaims(claims);
            }
            else if (provider.Name == TwitterProviderName)
            {
                claims = TransformTwitterClaims(claims);
            }

            return claims;
        }
        ExternalIdentity GetExternalIdentity(IEnumerable<Claim> claims)
        {
            if (claims == null || !claims.Any())
            {
                return null;
            }

            var subClaim = claims.FirstOrDefault(x => x.Type == Constants.ClaimTypes.Subject);
            if (subClaim == null)
            {
                subClaim = claims.FirstOrDefault(x => x.Type == ClaimTypes.NameIdentifier);

                if (subClaim == null)
                {
                    return null;
                }
            }

            claims = claims.Except(new Claim[] { subClaim });

            var idp = new IdentityProvider { Name = subClaim.Issuer };
            if (this.externalClaimsFilter != null)
            {
                claims = externalClaimsFilter.Filter(idp, claims);
            }

            claims = claims ?? Enumerable.Empty<Claim>();

            return new ExternalIdentity
            {
                Provider = idp,
                ProviderId = subClaim.Value,
                Claims = claims
            };
        }