[java-shib-metadata] branch main updated: JSMD-14 - Filter to add/remove Scope extension
Codeberg
noreply at shibboleth.net
Tue Jan 20 23:29:17 UTC 2026
This is an automated email from the git hooks/post-receive script.
codeberg pushed a commit to branch main
in repository java-shib-metadata.
View the commit online:
https://codeberg.org/Shibboleth/java-shib-metadata/commit/32b05736004bb7619f2cae0a0337af6c7a431650
The following commit(s) were added to refs/heads/main by this push:
new 32b05736 JSMD-14 - Filter to add/remove Scope extension
32b05736 is described below
commit 32b05736004bb7619f2cae0a0337af6c7a431650
Author: Scott Cantor <cantor.2 at osu.edu>
AuthorDate: Tue Jan 20 18:29:03 2026 -0500
JSMD-14 - Filter to add/remove Scope extension
https://shibboleth.atlassian.net/browse/JSMD-14
Spring parser and initial test.
Added schema mapping pointing to schema in API module.
---
.../spring/metadata/MetadataNamespaceHandler.java | 2 +
.../spring/metadata/filter/ScopeFilterParser.java | 167 +++++++++++++++++++++
.../src/main/resources/META-INF/spring.schemas | 1 +
.../main/resources/schema/shibboleth-metadata.xsd | 71 ++++++++-
.../metadata/filter/ScopeFilterParserTest.java | 108 +++++++++++++
.../shibboleth/spring/metadata/filter/scope.xml | 66 ++++++++
6 files changed, 411 insertions(+), 4 deletions(-)
diff --git a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/MetadataNamespaceHandler.java b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/MetadataNamespaceHandler.java
index de87918a..2c9bb348 100644
--- a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/MetadataNamespaceHandler.java
+++ b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/MetadataNamespaceHandler.java
@@ -29,6 +29,7 @@ import net.shibboleth.spring.metadata.filter.NodeProcessingParser;
import net.shibboleth.spring.metadata.filter.PredicateFilterParser;
import net.shibboleth.spring.metadata.filter.RequiredValidUntilParser;
import net.shibboleth.spring.metadata.filter.SchemaValidationParser;
+import net.shibboleth.spring.metadata.filter.ScopeFilterParser;
import net.shibboleth.spring.metadata.filter.SignatureValidationParser;
/** Namespace handler for <code>urn:mace:shibboleth:2.0:metadata</code>. */
@@ -63,6 +64,7 @@ public class MetadataNamespaceHandler extends BaseSpringNamespaceHandler {
registerBeanDefinitionParser(PredicateFilterParser.TYPE_NAME, new PredicateFilterParser());
registerBeanDefinitionParser(RequiredValidUntilParser.TYPE_NAME, new RequiredValidUntilParser());
registerBeanDefinitionParser(AlgorithmFilterParser.TYPE_NAME, new AlgorithmFilterParser());
+ registerBeanDefinitionParser(ScopeFilterParser.TYPE_NAME, new ScopeFilterParser());
registerBeanDefinitionParser(EntityAttributesFilterParser.TYPE_NAME, new EntityAttributesFilterParser());
registerBeanDefinitionParser(NameIDFormatFilterParser.TYPE_NAME, new NameIDFormatFilterParser());
registerBeanDefinitionParser(EntityRoleFilterParser.TYPE_NAME, new EntityRoleFilterParser());
diff --git a/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/ScopeFilterParser.java b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/ScopeFilterParser.java
new file mode 100644
index 00000000..f1a67e06
--- /dev/null
+++ b/shib-metadata-spring/src/main/java/net/shibboleth/spring/metadata/filter/ScopeFilterParser.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.shibboleth.spring.metadata.filter;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.annotation.Nonnull;
+import javax.xml.namespace.QName;
+
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.core.xml.io.Unmarshaller;
+import org.opensaml.core.xml.io.UnmarshallingException;
+import org.opensaml.core.xml.util.XMLObjectSupport;
+import org.opensaml.saml.common.profile.logic.EntityIdPredicate;
+import org.opensaml.saml.common.profile.logic.EntityRegexPredicate;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.config.RuntimeBeanReference;
+import org.springframework.beans.factory.support.BeanDefinitionBuilder;
+import org.springframework.beans.factory.support.ManagedList;
+import org.springframework.beans.factory.support.ManagedMap;
+import org.springframework.beans.factory.support.ManagedSet;
+import org.springframework.beans.factory.xml.ParserContext;
+import org.w3c.dom.Element;
+
+import net.shibboleth.idp.saml.metadata.impl.ScopeFilter;
+import net.shibboleth.idp.saml.xmlobject.Scope;
+import net.shibboleth.shared.logic.ScriptedPredicate;
+import net.shibboleth.shared.primitive.LoggerFactory;
+import net.shibboleth.shared.spring.util.SpringSupport;
+import net.shibboleth.shared.xml.ElementSupport;
+import net.shibboleth.spring.ScriptTypeBeanParser;
+import net.shibboleth.spring.metadata.AbstractMetadataProviderParser;
+
+/**
+ * Parser for Algorithm filter.
+ *
+ * @since 4.0.0
+ */
+public class ScopeFilterParser extends AbstractMetadataFilterParser {
+
+ /** Element name. */
+ @Nonnull public static final QName TYPE_NAME = new QName(AbstractMetadataProviderParser.METADATA_NAMESPACE,
+ "Scope");
+
+ /** Class logger. */
+ @Nonnull private final Logger log = LoggerFactory.getLogger(ScopeFilterParser.class);
+
+ /** {@inheritDoc} */
+ @Override
+ @Nonnull protected Class<?> getBeanClass(@Nonnull final Element element) {
+ return ScopeFilter.class;
+ }
+
+// Checkstyle: CyclomaticComplexity|MethodLength OFF
+ /** {@inheritDoc} */
+ @Override protected void doParse(@Nonnull final Element element, @Nonnull final ParserContext parserContext,
+ @Nonnull final BeanDefinitionBuilder builder) {
+
+ super.doParse(element, parserContext, builder);
+
+ if (element.hasAttributeNS(null, "removeExistingScopes")) {
+ builder.addPropertyValue("removeExistingScopes",
+ SpringSupport.getStringValueAsBoolean(element.getAttributeNS(null, "removeExistingScopes")));
+ }
+
+ final Unmarshaller scopeUnmarshaller = XMLObjectSupport.getUnmarshaller(Scope.DEFAULT_ELEMENT_NAME);
+ if (scopeUnmarshaller == null) {
+ throw new BeanCreationException("Unable to obtain Scope Unmarshaller");
+ }
+
+ // Accumulate objects to attach as rule values.
+ final List<XMLObject> accumulator = new ArrayList<>();
+
+ // Accumulated map of predicates to objects to attach to inject into filter.
+ final ManagedMap<Object, ManagedList<XMLObject>> ruleMap = new ManagedMap<>();
+
+ // Acumulation of entityIDs to use in the next automated Predicate.
+ // Interrupting a sequence of <Entity> elements will end the accumulation.
+ ManagedSet<String> entitySet = new ManagedSet<>();
+
+ Element child = ElementSupport.getFirstChildElement(element);
+
+ while (child != null) {
+
+ if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE, "Entity")) {
+ // Add to the active entity set.
+ entitySet.add(ElementSupport.getElementContentAsString(child));
+ child = ElementSupport.getNextSiblingElement(child);
+ continue;
+
+ } else if (!entitySet.isEmpty()) {
+ // "Commit" the current entity set as a single condition against the current accumulator.
+ // Then reset the entity set. Use a new object rather than clearing to ensure no cross-contamination.
+ final BeanDefinitionBuilder entityIdBuilder =
+ BeanDefinitionBuilder.genericBeanDefinition(EntityIdPredicate.class);
+ entityIdBuilder.addConstructorArgValue(entitySet);
+ final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
+ forRule.addAll(accumulator);
+ ruleMap.put(entityIdBuilder.getBeanDefinition(), forRule);
+
+ entitySet = new ManagedSet<>();
+ }
+
+ if (ElementSupport.isElementNamed(child, Scope.DEFAULT_ELEMENT_NAME)) {
+ try {
+ accumulator.add(scopeUnmarshaller.unmarshall(child));
+ } catch (final UnmarshallingException e) {
+ log.error("Error unmarshalling DigestMethod element", e);
+ }
+ } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
+ "EntityRegex")) {
+ final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
+ forRule.addAll(accumulator);
+ final BeanDefinitionBuilder expBuilder =
+ BeanDefinitionBuilder.genericBeanDefinition(EntityRegexPredicate.class);
+ expBuilder.addConstructorArgValue(ElementSupport.getElementContentAsString(child));
+ ruleMap.put(expBuilder.getBeanDefinition(), forRule);
+ } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
+ "ConditionRef")) {
+ final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
+ forRule.addAll(accumulator);
+ ruleMap.put(new RuntimeBeanReference(ElementSupport.getElementContentAsString(child)), forRule);
+ } else if (ElementSupport.isElementNamed(child, AbstractMetadataProviderParser.METADATA_NAMESPACE,
+ "ConditionScript")) {
+ final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
+ forRule.addAll(accumulator);
+ ruleMap.put(ScriptTypeBeanParser.parseScriptType(ScriptedPredicate.class, child).getBeanDefinition(),
+ forRule);
+ }
+
+ child = ElementSupport.getNextSiblingElement(child);
+ }
+
+ // Do a final check and commit for a non-empty entity set.
+ if (!entitySet.isEmpty()) {
+ final BeanDefinitionBuilder entityIdBuilder =
+ BeanDefinitionBuilder.genericBeanDefinition(EntityIdPredicate.class);
+ entityIdBuilder.addConstructorArgValue(entitySet);
+ final ManagedList<XMLObject> forRule = new ManagedList<>(accumulator.size());
+ forRule.addAll(accumulator);
+ ruleMap.put(entityIdBuilder.getBeanDefinition(), forRule);
+ }
+
+ builder.addPropertyValue("rules", ruleMap);
+ }
+// Checkstyle: CyclomaticComplexity|MethodLength ON
+
+ /** {@inheritDoc} */
+ @Override protected boolean shouldGenerateId() {
+ return true;
+ }
+
+}
\ No newline at end of file
diff --git a/shib-metadata-spring/src/main/resources/META-INF/spring.schemas b/shib-metadata-spring/src/main/resources/META-INF/spring.schemas
index 11cc37a8..b57c64f5 100644
--- a/shib-metadata-spring/src/main/resources/META-INF/spring.schemas
+++ b/shib-metadata-spring/src/main/resources/META-INF/spring.schemas
@@ -1,6 +1,7 @@
# Current Metadata
http\://shibboleth.net/schema/idp/shibboleth-security.xsd = schema/shibboleth-security.xsd
http\://shibboleth.net/schema/idp/shibboleth-metadata.xsd = schema/shibboleth-metadata.xsd
+http\://shibboleth.net/schema/idp/shibboleth-metadata-1.0.xsd = schema/shibboleth-metadata-1.0.xsd
# Legacy Metadata
classpath\:/schema/shibboleth-2.0-security.xsd = schema/shibboleth-security.xsd
diff --git a/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd b/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
index 45c77ce2..cbee4b70 100644
--- a/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
+++ b/shib-metadata-spring/src/main/resources/schema/shibboleth-metadata.xsd
@@ -1,10 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:mace:shibboleth:2.0:metadata"
- xmlns:shibmd="urn:mace:shibboleth:2.0:metadata" xmlns:security="urn:mace:shibboleth:2.0:security"
- xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
+ xmlns:shibmd="urn:mace:shibboleth:2.0:metadata"
+ xmlns:security="urn:mace:shibboleth:2.0:security"
+ xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+ xmlns:md="urn:oasis:names:tc:SAML:2.0:metadata"
xmlns:alg="urn:oasis:names:tc:SAML:metadata:algsupport"
+ xmlns:shibmdext="urn:mace:shibboleth:metadata:1.0"
elementFormDefault="qualified"
- version="5.0.0">
+ version="5.2.0">
<annotation>
<documentation>Schema describing metadata providers and filters.</documentation>
@@ -18,6 +21,8 @@
schemaLocation="http://docs.oasis-open.org/security/saml/Post2.0/sstc-saml-metadata-algsupport-v1.0.xsd"/>
<import namespace="urn:mace:shibboleth:2.0:security"
schemaLocation="http://shibboleth.net/schema/idp/shibboleth-security.xsd"/>
+ <import namespace="urn:mace:shibboleth:metadata:1.0"
+ schemaLocation="http://shibboleth.net/schema/idp/shibboleth-metadata-1.0.xsd"/>
<element name="MetadataProvider" type="shibmd:MetadataProviderType">
<annotation>
@@ -1372,7 +1377,58 @@
<annotation>
<documentation>
A regular expression to apply to EntityDescriptor's entityID to add all the preceding
- Attribute elements to.
+ extension elements to.
+ </documentation>
+ </annotation>
+ </element>
+ <element name="ConditionRef" type="shibmd:string">
+ <annotation>
+ <documentation>
+ The ID of a Spring bean to inject as a condition Predicate to identify one
+ or more EntityDescriptors to add all the preceding extension elements to.
+ </documentation>
+ </annotation>
+ </element>
+ <element name="ConditionScript" type="shibmd:ScriptType">
+ <annotation>
+ <documentation>
+ A script implementing Predicate<EntityDescriptor> to identify one
+ or more EntityDescriptors to add all the preceding extension elements to.
+ </documentation>
+ </annotation>
+ </element>
+ </choice>
+ </sequence>
+ </extension>
+ </complexContent>
+ </complexType>
+
+ <complexType name="Scope">
+ <annotation>
+ <documentation>
+ A filter that adjusts Scope extension content in metadata in order to drive software
+ behavior based on them. Sequences of Scope elements are supplied, and when an Entity or
+ ConditionRef is encountered, the preceding elements are applied to the corresponding entities.
+ </documentation>
+ </annotation>
+ <complexContent>
+ <extension base="shibmd:MetadataFilterType">
+ <sequence>
+ <choice minOccurs="0" maxOccurs="unbounded">
+ <element ref="shibmdext:Scope" />
+ <element name="Entity" type="shibmd:string">
+ <annotation>
+ <documentation>
+ An entityID to identify an EntityDescriptor to add all the preceding
+ extension elements to.
+ </documentation>
+ </annotation>
+ </element>
+ <element name="EntityRegex" type="shibmd:string">
+ <annotation>
+ <documentation>
+ A regular expression to apply to EntityDescriptor's entityID to add all the preceding
+ extension elements to.
</documentation>
</annotation>
</element>
@@ -1394,6 +1450,13 @@
</element>
</choice>
</sequence>
+ <attribute name="removeExistingScopes" type="boolean">
+ <annotation>
+ <documentation>
+ Whether to remove any existing Scopes when adding new ones (default is false).
+ </documentation>
+ </annotation>
+ </attribute>
</extension>
</complexContent>
</complexType>
diff --git a/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/ScopeFilterParserTest.java b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/ScopeFilterParserTest.java
new file mode 100644
index 00000000..a066c5ff
--- /dev/null
+++ b/shib-metadata-spring/src/test/java/net/shibboleth/spring/metadata/filter/ScopeFilterParserTest.java
@@ -0,0 +1,108 @@
+/*
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.shibboleth.spring.metadata.filter;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.util.List;
+
+import net.shibboleth.idp.saml.metadata.impl.ScopeFilter;
+import net.shibboleth.idp.saml.xmlobject.Scope;
+import net.shibboleth.shared.resolver.CriteriaSet;
+import net.shibboleth.shared.resolver.ResolverException;
+import net.shibboleth.spring.metadata.AbstractMetadataParserTest;
+
+import org.opensaml.core.criterion.EntityIdCriterion;
+import org.opensaml.core.xml.XMLObject;
+import org.opensaml.saml.metadata.resolver.MetadataResolver;
+import org.opensaml.saml.saml2.metadata.EntityDescriptor;
+import org.opensaml.saml.saml2.metadata.Extensions;
+import org.opensaml.saml.saml2.metadata.RoleDescriptor;
+import org.testng.Assert;
+import org.testng.annotations.Test;
+
+ at SuppressWarnings("javadoc")
+public class ScopeFilterParserTest extends AbstractMetadataParserTest {
+
+ @Test
+ public void test() throws ResolverException, IOException {
+ doTest("filter/scope.xml");
+ }
+
+ /*
+ @Test
+ public void testRegex() throws ResolverException, IOException {
+ doTest("filter/algorithmRegex.xml");
+ }
+
+ @Test
+ public void testFilterScript() throws ResolverException, IOException {
+ doTest("filter/algorithmWithScript.xml");
+ }
+
+ @Test
+ public void testFilterScriptResource() throws ResolverException, IOException {
+ doTest("filter/algorithmWithScriptResource.xml");
+ }
+ */
+
+ private void doTest(final String... files) throws ResolverException, IOException {
+
+ final MetadataResolver resolver = getBean(MetadataResolver.class, files);
+
+ final ScopeFilter filter = (ScopeFilter) resolver.getMetadataFilter();
+ Assert.assertNotNull(filter);
+
+ EntityIdCriterion crit = new EntityIdCriterion("https://sp.example.org/sp/shibboleth");
+ EntityDescriptor entity = resolver.resolveSingle(new CriteriaSet(crit));
+ validate(entity);
+
+ crit = new EntityIdCriterion("https://sp4.example.org/sp/shibboleth");
+ entity = resolver.resolveSingle(new CriteriaSet(crit));
+ if (entity != null) {
+ validate(entity);
+ }
+
+ crit = new EntityIdCriterion("https://sp2.example.org/sp/shibboleth");
+ entity = resolver.resolveSingle(new CriteriaSet(crit));
+ Assert.assertNotNull(entity);
+ assert entity != null;
+ final Extensions exts = entity.getExtensions();
+ if (exts != null) {
+ Assert.assertTrue(exts.getUnknownXMLObjects(Scope.DEFAULT_ELEMENT_NAME).isEmpty());
+ }
+ }
+
+ private void validate(final EntityDescriptor entity) {
+ for (final RoleDescriptor role : entity.getRoleDescriptors()) {
+ final Extensions exts = role.getExtensions();
+ assert exts != null;
+
+ final List<XMLObject> scopes = exts.getUnknownXMLObjects(Scope.DEFAULT_ELEMENT_NAME);
+
+ assertEquals(scopes.size(), 2);
+
+ final Scope scope1 = (Scope) scopes.get(0);
+ Assert.assertEquals(scope1.getValue(), "example.org");
+ Assert.assertEquals(scope1.getRegexp(), false);
+
+ final Scope scope2 = (Scope) scopes.get(1);
+ Assert.assertEquals(scope2.getValue(), "sub.example.org");
+ Assert.assertEquals(scope2.getRegexp(), true);
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/scope.xml b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/scope.xml
new file mode 100644
index 00000000..a0ed803d
--- /dev/null
+++ b/shib-metadata-spring/src/test/resources/net/shibboleth/spring/metadata/filter/scope.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<metadata:MetadataProvider xmlns="urn:oasis:names:tc:SAML:2.0:metadata"
+ xmlns:metadata="urn:mace:shibboleth:2.0:metadata"
+ xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion"
+ xmlns:shibmdext="urn:mace:shibboleth:metadata:1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="urn:mace:shibboleth:2.0:metadata http://shibboleth.net/schema/idp/shibboleth-metadata.xsd
+ urn:oasis:names:tc:SAML:2.0:assertion http://docs.oasis-open.org/security/saml/v2.0/saml-schema-assertion-2.0.xsd
+ urn:oasis:names:tc:SAML:2.0:metadata http://docs.oasis-open.org/security/saml/v2.0/saml-schema-metadata-2.0.xsd
+ urn:mace:shibboleth:metadata:1.0 http://shibboleth.net/schema/idp/shibboleth-metadata-1.0.xsd
+ http://www.w3.org/2009/xmlenc11# http://www.w3.org/TR/2013/REC-xmlenc-core1-20130411/xenc-schema-11.xsd"
+
+ failFastInitialization="false" requireValidMetadata="false"
+
+ id="scopes" xsi:type="metadata:InlineMetadataProvider">
+
+ <metadata:MetadataFilter xsi:type="metadata:Scope">
+ <shibmdext:Scope regexp="false">example.org</shibmdext:Scope>
+ <shibmdext:Scope regexp="true">sub.example.org</shibmdext:Scope>
+
+ <metadata:Entity>https://sp.example.org/sp/shibboleth</metadata:Entity>
+ <metadata:Entity>https://sp3.example.org/sp/shibboleth</metadata:Entity>
+ <metadata:Entity>https://sp4.example.org/sp/shibboleth</metadata:Entity>
+ <metadata:ConditionScript language="javascript">
+ <metadata:Script>input.getEntityID().equals("https://sp3.example.org/sp/shibboleth");</metadata:Script>
+ </metadata:ConditionScript>
+ </metadata:MetadataFilter>
+
+ <EntitiesDescriptor Name="ukgroup">
+ <EntityDescriptor
+ entityID="https://sp.example.org/sp/shibboleth">
+ <SPSSODescriptor
+ protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+
+ <AssertionConsumerService
+ Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
+ Location="https://sp.example.org/Shibboleth.sso/SAML2/POST-SimpleSign"
+ index="5" />
+ </SPSSODescriptor>
+ </EntityDescriptor>
+
+ <EntityDescriptor
+ entityID="https://sp2.example.org/sp/shibboleth">
+ <SPSSODescriptor
+ protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+
+ <AssertionConsumerService
+ Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
+ Location="https://sp2.example.org/Shibboleth.sso/SAML2/POST-SimpleSign"
+ index="5" />
+ </SPSSODescriptor>
+ </EntityDescriptor>
+
+ <EntityDescriptor
+ entityID="https://sp4.example.org/sp/shibboleth">
+ <SPSSODescriptor
+ protocolSupportEnumeration="urn:oasis:names:tc:SAML:1.1:protocol urn:oasis:names:tc:SAML:2.0:protocol">
+
+ <AssertionConsumerService
+ Binding="urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign"
+ Location="https://sp4.example.org/Shibboleth.sso/SAML2/POST-SimpleSign"
+ index="5" />
+ </SPSSODescriptor>
+ </EntityDescriptor>
+ </EntitiesDescriptor>
+</metadata:MetadataProvider>
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the commits
mailing list