/// <summary>
        /// Checks authorization for the given operation context.
        /// </summary>
        /// <param name="operationContext">Operation context.</param>
        /// <returns>True if access is granted otherwise false.</returns>
        public override bool CheckAccess(OperationContext operationContext)
        {
            try
            {
                if (base.CheckAccess(operationContext) == false)
                {
                    return(false);
                }
                if (operationContext.Host == null || operationContext.Host.Description == null)
                {
                    return(false);
                }
                if (operationContext.ServiceSecurityContext == null || operationContext.ServiceSecurityContext.AuthorizationContext == null || operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets == null)
                {
                    return(false);
                }

                var trustedClaimSets = _authorizationHandler.GetTrustedClaimSets(operationContext.ServiceSecurityContext.AuthorizationContext.ClaimSets);
                _authorizationHandler.Authorize(trustedClaimSets, operationContext.Host.Description.ServiceType);

                return(true);
            }
            catch (Exception ex)
            {
                throw new FaultException(Resource.GetExceptionMessage(ExceptionMessage.NotAuthorizedToUseService, ex.Message));
            }
        }
        /// <summary>
        /// Creates a collection of claims identities based on the given claim sets.
        /// </summary>
        /// <param name="claimSets">Claim sets which should be used to create claims identities.</param>
        /// <returns>Collection of claims identities based on the given claims sets.</returns>
        private IEnumerable <IClaimsIdentity> CreateClaimsIdentity(IEnumerable <ClaimSet> claimSets)
        {
            if (claimSets == null)
            {
                return(new List <ClaimsIdentity> {
                    new ClaimsIdentity()
                });
            }
            var trustedClaimSets = _authorizationHandler.GetTrustedClaimSets(claimSets);

            return(trustedClaimSets
                   .Select(claimSet =>
            {
                var issuer = GetIssuer(claimSet.Issuer);
                var claims = claimSet
                             .Where(claim => string.Compare(claim.Right, Rights.PossessProperty, StringComparison.Ordinal) == 0)
                             .Select(claim =>
                {
                    if (string.Compare(claim.ClaimType, ClaimTypes.Sid, StringComparison.Ordinal) == 0 && claim.Resource is SecurityIdentifier)
                    {
                        if (string.Compare(claim.Right, Rights.Identity, StringComparison.Ordinal) == 0)
                        {
                            return new Claim(ClaimTypes.PrimarySid, ((SecurityIdentifier)claim.Resource).Value, ClaimValueTypes.String, issuer, issuer);
                        }
                        return new Claim(ClaimTypes.GroupSid, ((SecurityIdentifier)claim.Resource).Value, ClaimValueTypes.String, issuer, issuer);
                    }
                    if (string.Compare(claim.ClaimType, ClaimTypes.Email, StringComparison.Ordinal) == 0 && claim.Resource is MailAddress)
                    {
                        return new Claim(claim.ClaimType, ((MailAddress)claim.Resource).Address, ClaimValueTypes.String, issuer, issuer);
                    }
                    if (string.Compare(claim.ClaimType, ClaimTypes.Thumbprint, StringComparison.Ordinal) == 0 && claim.Resource is byte[])
                    {
                        return new Claim(claim.ClaimType, Convert.ToBase64String((byte[])claim.Resource), ClaimValueTypes.Base64Binary, issuer, issuer);
                    }
                    if (string.Compare(claim.ClaimType, ClaimTypes.Hash, StringComparison.Ordinal) == 0 && claim.Resource is byte[])
                    {
                        return new Claim(claim.ClaimType, Convert.ToBase64String((byte[])claim.Resource), ClaimValueTypes.Base64Binary, issuer, issuer);
                    }
                    if (string.Compare(claim.ClaimType, ClaimTypes.NameIdentifier, StringComparison.Ordinal) == 0 && claim.Resource is SamlNameIdentifierClaimResource)
                    {
                        var newClaim = new Claim(claim.ClaimType, ((SamlNameIdentifierClaimResource)claim.Resource).Name, ClaimValueTypes.String, issuer, issuer);
                        if (((SamlNameIdentifierClaimResource)claim.Resource).Format != null)
                        {
                            newClaim.Properties[ClaimProperties.SamlNameIdentifierFormat] = ((SamlNameIdentifierClaimResource)claim.Resource).Format;
                        }
                        if (((SamlNameIdentifierClaimResource)claim.Resource).NameQualifier != null)
                        {
                            newClaim.Properties[ClaimProperties.SamlNameIdentifierNameQualifier] = ((SamlNameIdentifierClaimResource)claim.Resource).NameQualifier;
                        }
                        return newClaim;
                    }
                    if (string.Compare(claim.ClaimType, ClaimTypes.X500DistinguishedName, StringComparison.Ordinal) == 0 && claim.Resource is X500DistinguishedName)
                    {
                        return new Claim(claim.ClaimType, ((X500DistinguishedName)claim.Resource).Name, ClaimValueTypes.X500Name, issuer, issuer);
                    }
                    if (string.Compare(claim.ClaimType, ClaimTypes.Uri, StringComparison.Ordinal) == 0 && claim.Resource is Uri)
                    {
                        return new Claim(claim.ClaimType, ((Uri)claim.Resource).AbsoluteUri, ClaimValueTypes.String, issuer, issuer);
                    }
                    if (string.Compare(claim.ClaimType, ClaimTypes.Rsa, StringComparison.Ordinal) == 0 && claim.Resource is RSA)
                    {
                        return new Claim(claim.ClaimType, ((RSA)claim.Resource).ToXmlString(false), ClaimValueTypes.RsaKeyValue, issuer, issuer);
                    }
                    if (string.Compare(claim.ClaimType, ClaimTypes.DenyOnlySid, StringComparison.Ordinal) == 0 && claim.Resource is SecurityIdentifier)
                    {
                        return new Claim(claim.ClaimType, ((SecurityIdentifier)claim.Resource).Value, ClaimValueTypes.String, issuer, issuer);
                    }
                    if (claim.Resource as string != null)
                    {
                        return new Claim(claim.ClaimType, (string)claim.Resource, ClaimValueTypes.String, issuer, issuer);
                    }
                    return new Claim(claim.ClaimType, claim.Resource == null ? "{null}" : claim.Resource.ToString(), ClaimValueTypes.String, issuer, issuer);
                })
                             .ToArray();
                return new ClaimsIdentity(claims);
            })
                   .ToArray());
        }