Skip to content

Commit 886dc63

Browse files
mattgdblairworkos
andauthored
Merge commit from fork
* Patch for version 2 * Backport v6 patch, loading references from canon XML. * Only allow exclusive canon. * Updates based on v6 feedback. * Apply changes --------- Co-authored-by: Blair Weber <[email protected]>
1 parent 7016163 commit 886dc63

7 files changed

+215
-10
lines changed

lib/signed-xml.js

Lines changed: 97 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -383,6 +383,46 @@ SignedXml.prototype.checkSignature = function(xml, callback) {
383383

384384
var doc = new Dom().parseFromString(xml)
385385

386+
// Reset the references as only references from our re-parsed signedInfo node can be trusted
387+
this.references = [];
388+
389+
const unverifiedSignedInfoCanon = this.getCanonSignedInfoXml(doc);
390+
if (!unverifiedSignedInfoCanon) {
391+
if (callback) {
392+
callback(new Error("Canonical signed info not be empty"));
393+
return;
394+
} else {
395+
throw new Error("Canonical signed info not be empty");
396+
}
397+
}
398+
399+
// unsigned, verify later to keep with consistent callback behavior
400+
const unverifiedParsedSignedInfo = new Dom().parseFromString(unverifiedSignedInfoCanon, "text/xml");
401+
402+
const unverifiedSignedInfoDoc = unverifiedParsedSignedInfo.documentElement;
403+
if (!unverifiedSignedInfoDoc) {
404+
if (callback) {
405+
callback(new Error("Could not parse signedInfoCanon into a document"));
406+
return;
407+
} else {
408+
throw new Error("Could not parse signedInfoCanon into a document");
409+
}
410+
}
411+
412+
const references = utils.findChilds(unverifiedSignedInfoDoc, "Reference");
413+
if (references.length === 0) {
414+
if (callback) {
415+
callback(new Error("Could not find any Reference elements"));
416+
return;
417+
} else {
418+
throw new Error("Could not find any Reference elements");
419+
}
420+
}
421+
422+
for (const reference of references) {
423+
this.loadReference(reference);
424+
}
425+
386426
if (!this.validateReferences(doc)) {
387427
if (!callback) {
388428
return false;
@@ -392,6 +432,7 @@ SignedXml.prototype.checkSignature = function(xml, callback) {
392432
}
393433
}
394434

435+
// Stage B: Take the signature algorithm and key and verify the SignatureValue against the canonicalized SignedInfo
395436
if (!callback) {
396437
//Syncronous flow
397438
if (!this.validateSignatureValue(doc)) {
@@ -414,7 +455,14 @@ SignedXml.prototype.checkSignature = function(xml, callback) {
414455

415456
SignedXml.prototype.getCanonSignedInfoXml = function(doc) {
416457
var signedInfo = utils.findChilds(this.signatureNode, "SignedInfo")
417-
if (signedInfo.length==0) throw new Error("could not find SignedInfo element in the message")
458+
if (signedInfo.length == 0) {
459+
throw new Error("could not find SignedInfo element in the message")
460+
}
461+
if (signedInfo.length > 1) {
462+
throw new Error(
463+
"could not get canonicalized signed info for a signature that contains multiple SignedInfo nodes",
464+
);
465+
}
418466

419467
if(this.canonicalizationAlgorithm === "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"
420468
|| this.canonicalizationAlgorithm === "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments")
@@ -494,7 +542,7 @@ SignedXml.prototype.validateReferences = function(doc) {
494542

495543
var ref = this.references[r]
496544

497-
var uri = ref.uri[0]=="#" ? ref.uri.substring(1) : ref.uri
545+
var uri = ref.uri ? (ref.uri[0]=="#" ? ref.uri.substring(1) : ref.uri) : "";
498546
var elem = [];
499547

500548
if (uri=="") {
@@ -596,8 +644,43 @@ SignedXml.prototype.loadSignature = function(signatureNode) {
596644
this.signatureAlgorithm =
597645
utils.findFirst(signatureNode, ".//*[local-name(.)='SignatureMethod']/@Algorithm").value
598646

647+
const signedInfoNodes = utils.findChilds(this.signatureNode, "SignedInfo");
648+
if (signedInfoNodes.length == 0) {
649+
throw new Error("no signed info node found");
650+
}
651+
if (signedInfoNodes.length > 1) {
652+
throw new Error("could not load signature that contains multiple SignedInfo nodes");
653+
}
654+
655+
// Try to operate on the c14n version of `signedInfo`. This forces the initial `getReferences()`
656+
// API call to always return references that are loaded under the canonical `SignedInfo`
657+
// in the case that the client access the `.references` **before** signature verification.
658+
659+
// Ensure canonicalization algorithm is exclusive, otherwise we'd need the entire document
660+
let canonicalizationAlgorithmForSignedInfo = this.canonicalizationAlgorithm;
661+
if (
662+
!canonicalizationAlgorithmForSignedInfo ||
663+
canonicalizationAlgorithmForSignedInfo ===
664+
"http://www.w3.org/TR/2001/REC-xml-c14n-20010315" ||
665+
canonicalizationAlgorithmForSignedInfo ===
666+
"http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"
667+
) {
668+
canonicalizationAlgorithmForSignedInfo = "http://www.w3.org/2001/10/xml-exc-c14n#";
669+
}
670+
671+
const temporaryCanonSignedInfo = this.getCanonXml(
672+
[canonicalizationAlgorithmForSignedInfo],
673+
signedInfoNodes[0],
674+
);
675+
const temporaryCanonSignedInfoXml = new Dom().parseFromString(
676+
temporaryCanonSignedInfo,
677+
"text/xml",
678+
);
679+
const signedInfoDoc = temporaryCanonSignedInfoXml.documentElement;
680+
599681
this.references = []
600-
var references = xpath.select(".//*[local-name(.)='SignedInfo']/*[local-name(.)='Reference']", signatureNode)
682+
683+
const references = utils.findChilds(signedInfoDoc, "Reference");
601684
if (references.length == 0) throw new Error("could not find any Reference elements")
602685

603686
for (var i in references) {
@@ -626,12 +709,16 @@ SignedXml.prototype.loadReference = function(ref) {
626709
var digestAlgo = attr.value
627710

628711
nodes = utils.findChilds(ref, "DigestValue")
629-
if (nodes.length==0) throw new Error("could not find DigestValue node in reference " + ref.toString())
630-
if (nodes[0].childNodes.length==0 || !nodes[0].firstChild.data)
631-
{
632-
throw new Error("could not find the value of DigestValue in " + nodes[0].toString())
712+
if (nodes.length > 1) {
713+
throw new Error(
714+
`could not load reference for a node that contains multiple DigestValue nodes: ${ref.toString()}`,
715+
);
716+
}
717+
718+
const digestValue = nodes[0].textContent;
719+
if (!digestValue) {
720+
throw new Error(`could not find the value of DigestValue in ${ref.toString()}`);
633721
}
634-
var digestValue = nodes[0].firstChild.data
635722

636723
var transforms = []
637724
var inclusiveNamespacesPrefixList;
@@ -679,7 +766,8 @@ SignedXml.prototype.loadReference = function(ref) {
679766
transforms.push("http://www.w3.org/TR/2001/REC-xml-c14n-20010315")
680767
}
681768

682-
this.addReference(null, transforms, digestAlgo, utils.findAttr(ref, "URI").value, digestValue, inclusiveNamespacesPrefixList, false)
769+
const refUri = ref.getAttribute("URI") || undefined;
770+
this.addReference(null, transforms, digestAlgo, refUri, digestValue, inclusiveNamespacesPrefixList, false)
683771
}
684772

685773
SignedXml.prototype.addReference = function(xpath, transforms, digestAlgorithm, uri, digestValue, inclusiveNamespacesPrefixList, isEmptyUri) {

test/saml-response-test.js

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,102 @@ exports['test validating SAML response WithComments'] = function (test) {
7777
test.equal(result, false);
7878
test.done();
7979
};
80+
81+
exports["test validating SAML response with digest comment"] = function (test) {
82+
var xml = fs.readFileSync("./test/static/valid_saml_with_digest_comment.xml", "utf-8");
83+
var doc = new xmldom.DOMParser().parseFromString(xml);
84+
const assertion = xpath.select1("//*[local-name(.)='Assertion']", doc);
85+
const signature = xpath.select1(
86+
"//*[local-name(.)='Signature' and namespace-uri(.)='http://www.w3.org/2000/09/xmldsig#']",
87+
assertion,
88+
);
89+
var sig = new crypto.SignedXml();
90+
sig.keyInfoProvider = new crypto.FileKeyInfo("./test/static/feide_public.pem");
91+
sig.loadSignature(signature);
92+
var result = sig.checkSignature(xml);
93+
test.equal(sig.references[0].digestValue, "RnNjoyUguwze5w2R+cboyTHlkQk=");
94+
test.equal(result, false);
95+
test.done();
96+
};
97+
98+
exports["test signature contains a SignedInfo node"] = function (test) {
99+
var xml = fs.readFileSync("./test/static/invalid_saml_no_signed_info.xml", "utf-8");
100+
var doc = new xmldom.DOMParser().parseFromString(xml);
101+
const node = xpath.select1(
102+
"/*/*[local-name(.)='Signature' and namespace-uri(.)='http://www.w3.org/2000/09/xmldsig#']",
103+
doc,
104+
);
105+
var sig = new crypto.SignedXml();
106+
sig.keyInfoProvider = new crypto.FileKeyInfo("./test/static/feide_public.pem");
107+
test.throws(
108+
function () {
109+
sig.loadSignature(node);
110+
},
111+
Error,
112+
"no signed info node found"
113+
);
114+
test.done();
115+
};
116+
117+
exports["throws an error for a document with no `SignedInfo` node"] = function (
118+
test
119+
) {
120+
var xml = fs.readFileSync(
121+
"./test/static/invalid_saml_no_signed_info.xml",
122+
"utf-8"
123+
);
124+
var doc = new xmldom.DOMParser().parseFromString(xml);
125+
const node = xpath.select1(
126+
"/*/*[local-name(.)='Signature' and namespace-uri(.)='http://www.w3.org/2000/09/xmldsig#']",
127+
doc
128+
);
129+
var sig = new crypto.SignedXml();
130+
const feidePublicCert = fs.readFileSync("./test/static/feide_public.pem");
131+
sig.publicCert = feidePublicCert;
132+
133+
test.throws(
134+
function () {
135+
sig.loadSignature(node);
136+
},
137+
Error,
138+
"no signed info node found"
139+
);
140+
test.done();
141+
};
142+
143+
exports["test validation ignores an additional wrapped `SignedInfo` node"] = function (test) {
144+
var xml = fs.readFileSync("./test/static/saml_wrapped_signed_info_node.xml", "utf-8");
145+
var doc = new xmldom.DOMParser().parseFromString(xml);
146+
var assertion = xpath.select("//*[local-name(.)='Assertion']", doc)[0];
147+
var signature = xpath.select(
148+
"//*[local-name(.)='Signature' and namespace-uri(.)='http://www.w3.org/2000/09/xmldsig#']",
149+
assertion
150+
)[0];
151+
var sig = new crypto.SignedXml();
152+
sig.keyInfoProvider = new crypto.FileKeyInfo("./test/static/saml_external_ns.pem");
153+
sig.loadSignature(signature);
154+
test.equal(sig.references.length, 1);
155+
var result = sig.checkSignature(xml);
156+
test.equal(result, true);
157+
test.done();
158+
};
159+
160+
exports["test signature throws if multiple `SignedInfo` nodes are found"] = function (test) {
161+
var xml = fs.readFileSync("./test/static/saml_multiple_signed_info_nodes.xml", "utf-8");
162+
var doc = new xmldom.DOMParser().parseFromString(xml);
163+
var assertion = xpath.select("//*[local-name(.)='Assertion']", doc)[0];
164+
var signature = xpath.select(
165+
"//*[local-name(.)='Signature' and namespace-uri(.)='http://www.w3.org/2000/09/xmldsig#']",
166+
assertion
167+
)[0];
168+
var sig = new crypto.SignedXml();
169+
sig.keyInfoProvider = new crypto.FileKeyInfo("./test/static/saml_external_ns.pem");
170+
test.throws(
171+
function () {
172+
sig.loadSignature(signature);
173+
},
174+
Error,
175+
"could not load signature that contains multiple SignedInfo nodes"
176+
);
177+
test.done();
178+
};

test/signature-unit-tests.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -733,7 +733,7 @@ function verifyDoesNotDuplicateIdAttributes(test, mode, prefix) {
733733
}
734734

735735
function verifyAddsId(test, mode, nsMode) {
736-
var xml = "<x xmlns=\"ns\"></x><y attr=\"value\"></y><z><w></w></z>"
736+
var xml = "<x xmlns=\"ns\"><y attr=\"value\"></y><z><w></w></z></x>"
737737
var sig = new SignedXml(mode)
738738
sig.signingKey = fs.readFileSync("./test/static/client.pem")
739739

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<samlp:Response xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion" ID="pfx94e4a319-b6f7-4a40-25d1-01fcb642e4c5" Version="2.0" IssueInstant="2012-07-03T11:32:20Z" Destination="http://localhost:3000/login/callback" InResponseTo="_d766d16611ac0d14121b"><saml:Issuer>https://openidp.feide.no</saml:Issuer><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
2+
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
3+
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
4+
<ds:SignatureValue>dkONrkxW+LSuDvnNMG/mWYFa47d2WGyapLhXSTYqrlT9Td+tT7ciojNJ55WTaPaCMt7IrGtIxxskPAZIjdIn5pRyDxHr0joWxzZ7oZHCOI1CnQV5HjOq+rzzmEN2LctCZ6S4hbL7SQ1qJ3vp2BCXAygy4tmJOURQdnk0KLwwRS8=</ds:SignatureValue>
5+
<ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIICizCCAfQCCQCY8tKaMc0BMjANBgkqhkiG9w0BAQUFADCBiTELMAkGA1UEBhMCTk8xEjAQBgNVBAgTCVRyb25kaGVpbTEQMA4GA1UEChMHVU5JTkVUVDEOMAwGA1UECxMFRmVpZGUxGTAXBgNVBAMTEG9wZW5pZHAuZmVpZGUubm8xKTAnBgkqhkiG9w0BCQEWGmFuZHJlYXMuc29sYmVyZ0B1bmluZXR0Lm5vMB4XDTA4MDUwODA5MjI0OFoXDTM1MDkyMzA5MjI0OFowgYkxCzAJBgNVBAYTAk5PMRIwEAYDVQQIEwlUcm9uZGhlaW0xEDAOBgNVBAoTB1VOSU5FVFQxDjAMBgNVBAsTBUZlaWRlMRkwFwYDVQQDExBvcGVuaWRwLmZlaWRlLm5vMSkwJwYJKoZIhvcNAQkBFhphbmRyZWFzLnNvbGJlcmdAdW5pbmV0dC5ubzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAt8jLoqI1VTlxAZ2axiDIThWcAOXdu8KkVUWaN/SooO9O0QQ7KRUjSGKN9JK65AFRDXQkWPAu4HlnO4noYlFSLnYyDxI66LCr71x4lgFJjqLeAvB/GqBqFfIZ3YK/NrhnUqFwZu63nLrZjcUZxNaPjOOSRSDaXpv1kb5k3jOiSGECAwEAATANBgkqhkiG9w0BAQUFAAOBgQBQYj4cAafWaYfjBU2zi1ElwStIaJ5nyp/s/8B8SAPK2T79McMyccP3wSW13LHkmM1jwKe3ACFXBvqGQN0IbcH49hu0FKhYFM/GPDJcIHFBsiyMBXChpye9vBaTNEBCtU3KjjyG0hRT2mAQ9h+bkPmOvlEo/aH0xR68Z9hw4PF13w==</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature><samlp:Status><samlp:StatusCode Value="urn:oasis:names:tc:SAML:2.0:status:Success"/></samlp:Status><saml:Assertion xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xs="http://www.w3.org/2001/XMLSchema" ID="pfx66496e6c-3c29-230d-6d47-b245434b872d" Version="2.0" IssueInstant="2012-07-03T11:32:20Z"><saml:Issuer>https://openidp.feide.no</saml:Issuer><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
6+
<ds:SignedInfo><ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
7+
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
8+
<ds:Reference URI="#pfx66496e6c-3c29-230d-6d47-b245434b872d"><ds:Transforms><ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><ds:DigestValue>RnNjoyUguwze5w2R+cboyTHlkQk=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>aw5711jKP7xragunjRRCAD4mT4xKHc37iohBpQDbdSomD3ksOSB96UZQp0MtaC3xlVSkMtYw85Om96T2q2xrxLLYVA50eFJEMMF7SCVPStWTVjBlaCuOPEQxIaHyJs9Sy3MCEfbBh4Pqn9IJBd1kzwdlCrWWjAmksbFFg5wHQJA=</ds:SignatureValue>
9+
<ds:KeyInfo><ds:X509Data><ds:X509Certificate>MIICizCCAfQCCQCY8tKaMc0BMjANBgkqhkiG9w0BAQUFADCBiTELMAkGA1UEBhMCTk8xEjAQBgNVBAgTCVRyb25kaGVpbTEQMA4GA1UEChMHVU5JTkVUVDEOMAwGA1UECxMFRmVpZGUxGTAXBgNVBAMTEG9wZW5pZHAuZmVpZGUubm8xKTAnBgkqhkiG9w0BCQEWGmFuZHJlYXMuc29sYmVyZ0B1bmluZXR0Lm5vMB4XDTA4MDUwODA5MjI0OFoXDTM1MDkyMzA5MjI0OFowgYkxCzAJBgNVBAYTAk5PMRIwEAYDVQQIEwlUcm9uZGhlaW0xEDAOBgNVBAoTB1VOSU5FVFQxDjAMBgNVBAsTBUZlaWRlMRkwFwYDVQQDExBvcGVuaWRwLmZlaWRlLm5vMSkwJwYJKoZIhvcNAQkBFhphbmRyZWFzLnNvbGJlcmdAdW5pbmV0dC5ubzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAt8jLoqI1VTlxAZ2axiDIThWcAOXdu8KkVUWaN/SooO9O0QQ7KRUjSGKN9JK65AFRDXQkWPAu4HlnO4noYlFSLnYyDxI66LCr71x4lgFJjqLeAvB/GqBqFfIZ3YK/NrhnUqFwZu63nLrZjcUZxNaPjOOSRSDaXpv1kb5k3jOiSGECAwEAATANBgkqhkiG9w0BAQUFAAOBgQBQYj4cAafWaYfjBU2zi1ElwStIaJ5nyp/s/8B8SAPK2T79McMyccP3wSW13LHkmM1jwKe3ACFXBvqGQN0IbcH49hu0FKhYFM/GPDJcIHFBsiyMBXChpye9vBaTNEBCtU3KjjyG0hRT2mAQ9h+bkPmOvlEo/aH0xR68Z9hw4PF13w==</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature><saml:Subject><saml:NameID SPNameQualifier="passport-saml" Format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient">_6c5dcaa3053321ff4d63785fbc3f67c59a129cde82</saml:NameID><saml:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer"><saml:SubjectConfirmationData NotOnOrAfter="2012-07-03T11:37:20Z" Recipient="http://localhost:3000/login/callback" InResponseTo="_d766d16611ac0d14121b"/></saml:SubjectConfirmation></saml:Subject><saml:Conditions NotBefore="2012-07-03T11:31:50Z" NotOnOrAfter="2012-07-03T11:37:20Z"><saml:AudienceRestriction><saml:Audience>passport-saml</saml:Audience></saml:AudienceRestriction></saml:Conditions><saml:AuthnStatement AuthnInstant="2012-07-03T11:32:20Z" SessionNotOnOrAfter="2012-07-03T19:32:20Z" SessionIndex="_c8e6823fe38ddbce125f9be6e5118b8c352d04bcae"><saml:AuthnContext><saml:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml:AuthnContextClassRef></saml:AuthnContext></saml:AuthnStatement><saml:AttributeStatement><saml:Attribute Name="uid" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">bergie</saml:AttributeValue></saml:Attribute><saml:Attribute Name="givenName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">Henri</saml:AttributeValue></saml:Attribute><saml:Attribute Name="sn" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">Bergius</saml:AttributeValue></saml:Attribute><saml:Attribute Name="cn" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">Henri Bergius</saml:AttributeValue></saml:Attribute><saml:Attribute Name="mail" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">[email protected]</saml:AttributeValue></saml:Attribute><saml:Attribute Name="eduPersonPrincipalName" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">[email protected]</saml:AttributeValue></saml:Attribute><saml:Attribute Name="eduPersonTargetedID" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">8216c78fe244502efa13f62e6615c94acb7bdf3e</saml:AttributeValue></saml:Attribute><saml:Attribute Name="urn:oid:0.9.2342.19200300.100.1.1" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">bergie</saml:AttributeValue></saml:Attribute><saml:Attribute Name="urn:oid:2.5.4.42" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">Henri</saml:AttributeValue></saml:Attribute><saml:Attribute Name="urn:oid:2.5.4.4" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">Bergius</saml:AttributeValue></saml:Attribute><saml:Attribute Name="urn:oid:2.5.4.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">Henri Bergius</saml:AttributeValue></saml:Attribute><saml:Attribute Name="urn:oid:0.9.2342.19200300.100.1.3" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">[email protected]</saml:AttributeValue></saml:Attribute><saml:Attribute Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.6" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">[email protected]</saml:AttributeValue></saml:Attribute><saml:Attribute Name="urn:oid:1.3.6.1.4.1.5923.1.1.1.10" NameFormat="urn:oasis:names:tc:SAML:2.0:attrname-format:uri"><saml:AttributeValue xsi:type="xs:string">8216c78fe244502efa13f62e6615c94acb7bdf3e</saml:AttributeValue></saml:Attribute></saml:AttributeStatement></saml:Assertion></samlp:Response>

0 commit comments

Comments
 (0)