11using CIE . AspNetCore . Authentication . Resources ;
22using System ;
3- using System . Collections . Concurrent ;
43using System . Linq ;
54using System . Security . Cryptography ;
65using System . Security . Cryptography . X509Certificates ;
76using System . Security . Cryptography . Xml ;
87using System . Xml ;
9- using System . Xml . Serialization ;
108
119namespace CIE . AspNetCore . Authentication . Helpers
1210{
@@ -36,7 +34,7 @@ internal static XmlElement SignXMLDoc(XmlDocument doc,
3634
3735 try
3836 {
39- privateKey = certificate . PrivateKey ;
37+ privateKey = certificate . GetRSAPrivateKey ( ) ;
4038 }
4139 catch ( Exception ex )
4240 {
@@ -80,11 +78,9 @@ internal static bool VerifySignature(XmlDocument signedDocument, Saml.IdP.Entity
8078
8179 try
8280 {
83- SignedXml signedXml = new SignedXml ( signedDocument ) ;
84-
8581 if ( xmlMetadata is not null )
8682 {
87- bool validated = false ;
83+ var validated = false ;
8884 var idpSSODescriptor = xmlMetadata . Items . FirstOrDefault ( i => i is Saml . IdP . IDPSSODescriptorType ) as Saml . IdP . IDPSSODescriptorType ;
8985 if ( idpSSODescriptor is not null )
9086 {
@@ -96,14 +92,7 @@ internal static bool VerifySignature(XmlDocument signedDocument, Saml.IdP.Entity
9692 var x509Cert = keyData . Items . FirstOrDefault ( i => i is byte [ ] ) as byte [ ] ;
9793 if ( x509Cert is not null )
9894 {
99- var publicMetadataCert = new X509Certificate2 ( x509Cert ) ;
100- XmlNodeList nodeList = ( signedDocument . GetElementsByTagName ( "ds:Signature" ) ? . Count > 1 ) ?
101- signedDocument . GetElementsByTagName ( "ds:Signature" ) :
102- ( signedDocument . GetElementsByTagName ( "ns2:Signature" ) ? . Count > 1 ) ?
103- signedDocument . GetElementsByTagName ( "ns2:Signature" ) :
104- signedDocument . GetElementsByTagName ( "Signature" ) ;
105- signedXml . LoadXml ( ( XmlElement ) nodeList [ 0 ] ) ;
106- validated |= signedXml . CheckSignature ( publicMetadataCert , true ) ;
95+ validated |= VerifyAllSignatures ( signedDocument , new X509Certificate2 ( x509Cert ) ) ;
10796 }
10897 }
10998 }
@@ -112,11 +101,7 @@ internal static bool VerifySignature(XmlDocument signedDocument, Saml.IdP.Entity
112101 }
113102 else
114103 {
115- XmlNodeList nodeList = ( signedDocument . GetElementsByTagName ( "ds:Signature" ) ? . Count > 0 ) ?
116- signedDocument . GetElementsByTagName ( "ds:Signature" ) :
117- signedDocument . GetElementsByTagName ( "Signature" ) ;
118- signedXml . LoadXml ( ( XmlElement ) nodeList [ 0 ] ) ;
119- return signedXml . CheckSignature ( ) ;
104+ return VerifyAllSignatures ( signedDocument ) ;
120105 }
121106 }
122107 catch ( Exception )
@@ -125,64 +110,26 @@ internal static bool VerifySignature(XmlDocument signedDocument, Saml.IdP.Entity
125110 }
126111 }
127112
128- private static readonly ConcurrentDictionary < Type , XmlSerializer > serializers = new ConcurrentDictionary < Type , XmlSerializer > ( ) ;
129- /// <summary>
130- /// Serializes to XML document.
131- /// </summary>
132- /// <param name="o">The o.</param>
133- /// <returns></returns>
134- public static XmlDocument SerializeToXmlDoc ( this object o )
113+ private static bool VerifyAllSignatures ( XmlDocument signedDocument , X509Certificate2 ? publicMetadataCert = null )
135114 {
136- XmlDocument doc = new XmlDocument ( ) { PreserveWhitespace = true } ;
115+ bool internalResult = true ;
116+
117+ XmlNodeList signatureNodes = signedDocument . GetElementsByTagName ( "Signature" , SignedXml . XmlDsigNamespaceUrl ) ;
137118
138- using XmlWriter writer = doc . CreateNavigator ( ) . AppendChild ( ) ;
139- if ( ! serializers . ContainsKey ( o . GetType ( ) ) )
119+ if ( signatureNodes . Count == 0 )
140120 {
141- var serializer = new XmlSerializer ( o . GetType ( ) ) ;
142- serializers . AddOrUpdate ( o . GetType ( ) , serializer , ( key , value ) => serializer ) ;
121+ return false ;
143122 }
144- serializers [ o . GetType ( ) ] . Serialize ( writer , o ) ;
145-
146- return doc ;
147- }
148-
149- public static XmlElement SerializeInternalExtensionToXmlElement ( object o , string namespacePrefix , string xmlNamespace )
150- {
151- XmlDocument doc = SerializeExtensionToXmlElementInternal ( o , namespacePrefix , xmlNamespace ) ;
152-
153- return doc . DocumentElement . FirstChild as XmlElement ;
154- }
155123
156- public static XmlElement SerializeExtensionToXmlElement ( object o , string namespacePrefix , string xmlNamespace )
157- {
158- XmlDocument doc = SerializeExtensionToXmlElementInternal ( o , namespacePrefix , xmlNamespace ) ;
159-
160- return doc . DocumentElement ;
161- }
162-
163- private static XmlDocument SerializeExtensionToXmlElementInternal ( object o , string namespacePrefix , string xmlNamespace )
164- {
165- XmlDocument doc = new XmlDocument ( ) ;
166-
167- using ( XmlWriter writer = doc . CreateNavigator ( ) . AppendChild ( ) )
124+ foreach ( var signatureNode in signatureNodes )
168125 {
169- var ns = new XmlSerializerNamespaces ( ) ;
170- ns . Add ( namespacePrefix , xmlNamespace ) ;
171- new XmlSerializer ( o . GetType ( ) ) . Serialize ( writer , o , ns ) ;
126+ SignedXml signedXml = new ( signedDocument ) ;
127+ signedXml . LoadXml ( ( XmlElement ) signatureNode ) ;
128+ internalResult &= publicMetadataCert is null
129+ ? signedXml . CheckSignature ( )
130+ : signedXml . CheckSignature ( publicMetadataCert , true ) ;
172131 }
173-
174- return doc ;
175- }
176-
177- public static XmlElement GetXmlElement ( string prefix , string prefixNamespace , string tag , string value = null )
178- {
179- XmlDocument doc = new XmlDocument ( ) ;
180-
181- XmlElement elem = doc . CreateElement ( prefix , tag , prefixNamespace ) ;
182- if ( ! string . IsNullOrEmpty ( value ) )
183- elem . InnerText = value ;
184-
185- return elem ;
132+ return internalResult ;
186133 }
187134 }
188135}
0 commit comments