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); }); }
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); }); }
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); } } }
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); } } }