diff --git a/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/BaseWriter.java b/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/BaseWriter.java index dfe0b90c44..7df18bdd83 100755 --- a/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/BaseWriter.java +++ b/saml-core/src/main/java/org/keycloak/saml/processing/core/saml/v2/writers/BaseWriter.java @@ -172,6 +172,8 @@ public class BaseWriter { if (attributeValue != null) { if (attributeValue instanceof String) { writeStringAttributeValue((String) attributeValue); + } else if (attributeValue instanceof NameIDType) { + writeNameIDTypeAttributeValue((NameIDType) attributeValue); } else throw logger.writerUnsupportedAttributeValueError(attributeValue.getClass().getName()); } @@ -179,6 +181,12 @@ public class BaseWriter { } } + public void writeNameIDTypeAttributeValue(NameIDType attributeValue) throws ProcessingException { + StaxUtil.writeStartElement(writer, ASSERTION_PREFIX, JBossSAMLConstants.ATTRIBUTE_VALUE.get(), ASSERTION_NSURI.get()); + write((NameIDType)attributeValue, new QName(ASSERTION_NSURI.get(), JBossSAMLConstants.NAMEID.get(), ASSERTION_PREFIX)); + StaxUtil.writeEndElement(writer); + } + public void writeStringAttributeValue(String attributeValue) throws ProcessingException { StaxUtil.writeStartElement(writer, ASSERTION_PREFIX, JBossSAMLConstants.ATTRIBUTE_VALUE.get(), ASSERTION_NSURI.get()); diff --git a/services/src/test/java/org/keycloak/test/broker/saml/SAMLDataMarshallerTest.java b/services/src/test/java/org/keycloak/test/broker/saml/SAMLDataMarshallerTest.java index 84354b9b8d..9a686217c8 100755 --- a/services/src/test/java/org/keycloak/test/broker/saml/SAMLDataMarshallerTest.java +++ b/services/src/test/java/org/keycloak/test/broker/saml/SAMLDataMarshallerTest.java @@ -35,6 +35,8 @@ public class SAMLDataMarshallerTest { private static final String TEST_ASSERTION = "http://localhost:8082/auth/realms/realm-with-saml-idp-basictest-userhttp://localhost:8081/auth/realms/realm-with-brokerurn:oasis:names:tc:SAML:2.0:ac:classes:unspecified617-666-7777test-user@localhostmanager"; + private static final String TEST_ASSERTION_WITH_NAME_ID = "http://localhost:8082/auth/realms/realm-with-saml-idp-basictest-userhttp://localhost:8081/auth/realms/realm-with-brokerurn:oasis:names:tc:SAML:2.0:ac:classes:unspecified617-666-7777test-user@localhostb2c6275838784dba219c92f53ea5493c8ef4da09"; + private static final String TEST_AUTHN_TYPE = "urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified"; @Test @@ -67,6 +69,20 @@ public class SAMLDataMarshallerTest { Assert.assertEquals(TEST_ASSERTION, serialized); } + @Test + public void testParseAssertionWitNameId() throws Exception { + SAMLDataMarshaller serializer = new SAMLDataMarshaller(); + AssertionType assertion = serializer.deserialize(TEST_ASSERTION_WITH_NAME_ID, AssertionType.class); + + // test assertion + Assert.assertEquals(assertion.getID(), "ID_29b196c2-d641-45c8-a423-8ed8e54d4cf9"); + Assert.assertEquals(((NameIDType) assertion.getSubject().getSubType().getBaseID()).getValue(), "test-user"); + + // back to String + String serialized = serializer.serialize(assertion); + Assert.assertEquals(TEST_ASSERTION_WITH_NAME_ID, serialized); + } + @Test public void testParseAuthnType() throws Exception { SAMLDataMarshaller serializer = new SAMLDataMarshaller();