Example #1
0
        public static void OnReceived(MetadataBase metadata, IDependencyResolver dependencyResolver)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }

            if (dependencyResolver == null)
            {
                throw new ArgumentNullException("dependencyResolver");
            }

            string entityId    = "RegisteredIssuer";
            var    handlerType = typeof(IMetadataHandler <>).MakeGenericType(metadata.GetType());
            var    handler     = dependencyResolver.Resolve(handlerType);

            var del  = IdpMetadataHandlerFactory.GetDelegateForIdpDescriptors(metadata.GetType(), typeof(IdentityProviderSingleSignOnDescriptor));
            var idps = del(handler, metadata).Cast <IdentityProviderSingleSignOnDescriptor>();

            var identityRegister = SecurityTokenHandlerConfiguration.DefaultIssuerNameRegistry as ConfigurationBasedIssuerNameRegistry;

            if (identityRegister == null)
            {
                return;
            }

            var register = idps.SelectMany(x => x.Keys.SelectMany(y => y.KeyInfo.Select(cl =>
            {
                var binaryClause = cl as BinaryKeyIdentifierClause;
                if (binaryClause == null)
                {
                    throw new InvalidOperationException(String.Format("Expected type: {0} but it was: {1}", typeof(BinaryKeyIdentifierClause), cl.GetType()));
                }

                var certContent = binaryClause.GetBuffer();
                var cert        = new X509Certificate2(certContent);
                return(cert);
            }))).Aggregate(identityRegister, (t, next) =>
            {
                if (!identityRegister.ConfiguredTrustedIssuers.Keys.Contains(next.Thumbprint))
                {
                    identityRegister.AddTrustedIssuer(next.Thumbprint, entityId);
                }
                return(t);
            });
        }
Example #2
0
        private static void CopyChanges(this ConnectionDetail connectionDetail, MetadataBase existingItem, MetadataBase newItem, List <Guid> deletedIds)
        {
            foreach (var prop in existingItem.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                if (!Attribute.IsDefined(prop, typeof(DataMemberAttribute)))
                {
                    continue;
                }

                var newValue      = prop.GetValue(newItem);
                var existingValue = prop.GetValue(existingItem) as MetadataBase;
                var type          = prop.PropertyType;

                if (type.IsArray)
                {
                    type = type.GetElementType();
                }

                if (!typeof(MetadataBase).IsAssignableFrom(type) && !typeof(Label).IsAssignableFrom(type))
                {
                    if (newItem.HasChanged != false)
                    {
                        prop.SetValue(existingItem, newValue);
                    }
                }
                else if (typeof(Label).IsAssignableFrom(type))
                {
                    if (newItem.HasChanged != false)
                    {
                        connectionDetail.CopyChanges((Label)prop.GetValue(existingItem), (Label)newValue, deletedIds);
                    }
                }
                else if (newValue != null)
                {
                    if (prop.PropertyType.IsArray)
                    {
                        connectionDetail.CopyChanges(existingItem, prop, (MetadataBase[])newValue, deletedIds);
                    }
                    else
                    {
                        if (existingValue.MetadataId == ((MetadataBase)newValue).MetadataId)
                        {
                            connectionDetail.CopyChanges(existingValue, (MetadataBase)newValue, deletedIds);
                        }
                        else
                        {
                            prop.SetValue(existingItem, newValue);
                        }
                    }
                }
                else if (existingValue != null && deletedIds.Contains(existingValue.MetadataId.Value))
                {
                    prop.SetValue(existingItem, null);
                }
            }
        }
        /// <summary>
        /// Invoke after metadata is retrieved and parsed
        /// </summary>
        /// <param name="metadata"></param>
        /// <param name="dependencyResolver"></param>
        public static void OnReceived(MetadataBase metadata, IDependencyResolver dependencyResolver)
        {
            if (metadata == null)
            {
                throw new ArgumentNullException("metadata");
            }

            if (dependencyResolver == null)
            {
                throw new ArgumentNullException("dependencyResolver");
            }

            string entityId    = "RegisteredIssuer";
            var    handlerType = typeof(IMetadataHandler <>).MakeGenericType(metadata.GetType());
            var    handler     = dependencyResolver.Resolve(handlerType) as IMetadataHandler;

            if (handler == null)
            {
                throw new InvalidOperationException(String.Format("Handler must implement: {0}", typeof(IMetadataHandler).Name));
            }
            var idps = handler.GetIdentityProviderSingleSignOnDescriptor(metadata);

            var certManager = dependencyResolver.Resolve <ICertificateManager>();

            //Default WIF implementation change if another policy is in place. Used to validate the issuer when building the claims
            var identityRegister = IdentityConfigurationHelper._identityConfiguration.IssuerNameRegistry as ConfigurationBasedIssuerNameRegistry;//SecurityTokenHandlerConfiguration.DefaultIssuerNameRegistry as ConfigurationBasedIssuerNameRegistry;

            if (identityRegister == null)
            {
                return;
            }

            var register = idps.SelectMany(x => x.Roles, (d, r) => new { d.EntityId, r }).SelectMany(x => x.r.Keys.SelectMany(y => y.KeyInfo.Select(cl =>
            {
                var binaryClause = cl as BinaryKeyIdentifierClause;
                if (binaryClause == null)
                {
                    throw new InvalidOperationException(String.Format("Expected type: {0} but it was: {1}", typeof(BinaryKeyIdentifierClause), cl.GetType()));
                }

                var certContent = binaryClause.GetBuffer();
                var cert        = new X509Certificate2(certContent);
                return(cert);
            })), (d, c) => new { d.EntityId, c }).Aggregate(identityRegister, (t, next) =>
            {
                if (!identityRegister.ConfiguredTrustedIssuers.Keys.Contains(next.c.Thumbprint))
                {
                    identityRegister.AddTrustedIssuer(certManager.GetCertificateThumbprint(next.c), next.EntityId);
                }
                return(t);
            });
        }
Example #4
0
        public virtual void Initialize(IList <MetadataBase> metabaseProviders)
        {
            Logger.Debug("Initializing metabases. Count {0}", metabaseProviders.Count);

            _metadataProviders = metabaseProviders;

            var currentNotifiers = All();

            foreach (var notificationProvider in metabaseProviders)
            {
                MetadataBase metadataProviderLocal = notificationProvider;
                if (!currentNotifiers.Exists(c => c.MetadataProviderType == metadataProviderLocal.GetType().ToString()))
                {
                    var settings = new MetadataDefinition
                    {
                        Enable = false,
                        MetadataProviderType = metadataProviderLocal.GetType().ToString(),
                        Name = metadataProviderLocal.Name
                    };

                    SaveSettings(settings);
                }
            }
        }
Example #5
0
        private static void RemoveDeletedItems(this ConnectionDetail connectionDetail, MetadataBase item, List <Guid> deletedIds)
        {
            foreach (var prop in item.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance))
            {
                if (!Attribute.IsDefined(prop, typeof(DataMemberAttribute)))
                {
                    continue;
                }

                var value     = prop.GetValue(item);
                var childItem = value as MetadataBase;
                var type      = prop.PropertyType;

                if (type.IsArray)
                {
                    type = type.GetElementType();
                }

                if (value is Label label)
                {
                    connectionDetail.RemoveDeletedItems(label, deletedIds);
                }
                else if (childItem != null && childItem.MetadataId != null && deletedIds.Contains(childItem.MetadataId.Value))
                {
                    prop.SetValue(item, null);
                }
                else if (childItem != null)
                {
                    connectionDetail.RemoveDeletedItems(childItem, deletedIds);
                }
                else if (value != null && prop.PropertyType.IsArray && typeof(MetadataBase).IsAssignableFrom(type))
                {
                    connectionDetail.RemoveDeletedItems(item, prop, deletedIds);
                }
            }
        }