Skip to content

Commit 0c60bb5

Browse files
committed
Not signing AuthnRequest and not expecting AuthnRequest to be signed. Furthermore, if an AuthnRequest is signed the signature is not verified.
1 parent 4b0d785 commit 0c60bb5

File tree

3 files changed

+25
-23
lines changed

3 files changed

+25
-23
lines changed

src/ITfoxtec.Identity.Saml2/Bindings/Saml2PostBinding.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ protected override Saml2PostBinding BindInternal(Saml2Request saml2RequestRespon
3232
{
3333
BindInternal(saml2RequestResponse);
3434

35-
if (saml2RequestResponse.Config.SigningCertificate != null)
35+
if (!(saml2RequestResponse is Saml2AuthnRequest) && saml2RequestResponse.Config.SigningCertificate != null)
3636
{
3737
Cryptography.SignatureAlgorithm.ValidateAlgorithm(saml2RequestResponse.Config.SignatureAlgorithm);
3838
XmlDocument = XmlDocument.SignDocument(saml2RequestResponse.Config.SigningCertificate, saml2RequestResponse.Config.SignatureAlgorithm, CertificateIncludeOption, saml2RequestResponse.Id.Value);
@@ -66,7 +66,7 @@ you must press the Continue button once to proceed.
6666
yield return string.Format(
6767
@"<input type=""hidden"" name=""{0}"" value=""{1}""/>", messageName, Convert.ToBase64String(Encoding.UTF8.GetBytes(XmlDocument.OuterXml)));
6868

69-
if(!string.IsNullOrWhiteSpace(RelayState))
69+
if (!string.IsNullOrWhiteSpace(RelayState))
7070
{
7171
yield return string.Format(
7272
@"<input type=""hidden"" name=""{0}"" value=""{1}""/>", Saml2Constants.Message.RelayState, RelayState);

src/ITfoxtec.Identity.Saml2/Bindings/Saml2RedirectBinding.cs

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@ protected override Saml2RedirectBinding BindInternal(Saml2Request saml2RequestRe
2424
{
2525
base.BindInternal(saml2RequestResponse);
2626

27-
if (saml2RequestResponse.Config.SigningCertificate != null)
27+
if (!(saml2RequestResponse is Saml2AuthnRequest) && saml2RequestResponse.Config.SigningCertificate != null)
2828
{
2929
Cryptography.SignatureAlgorithm.ValidateAlgorithm(saml2RequestResponse.Config.SignatureAlgorithm);
3030
SignatureAlgorithm = saml2RequestResponse.Config.SignatureAlgorithm;
3131
}
3232

33-
var requestQueryString = string.Join("&", RequestQueryString(saml2RequestResponse.Config.SigningCertificate, messageName));
34-
if (saml2RequestResponse.Config.SigningCertificate != null)
33+
var requestQueryString = string.Join("&", RequestQueryString(saml2RequestResponse, messageName));
34+
if (!(saml2RequestResponse is Saml2AuthnRequest) && saml2RequestResponse.Config.SigningCertificate != null)
3535
{
3636
requestQueryString = SigneQueryString(requestQueryString, saml2RequestResponse.Config.SigningCertificate);
3737
}
@@ -40,7 +40,7 @@ protected override Saml2RedirectBinding BindInternal(Saml2Request saml2RequestRe
4040

4141
return this;
4242
}
43-
43+
4444
private string SigneQueryString(string queryString, X509Certificate2 signingCertificate)
4545
{
4646
var saml2Signed = new Saml2SignedText(signingCertificate, SignatureAlgorithm);
@@ -49,7 +49,7 @@ private string SigneQueryString(string queryString, X509Certificate2 signingCert
4949
return string.Join("&", queryString, string.Join("=", Saml2Constants.Message.Signature, Uri.EscapeDataString(Signature)));
5050
}
5151

52-
private IEnumerable<string> RequestQueryString(X509Certificate2 signingCertificate, string messageName)
52+
private IEnumerable<string> RequestQueryString(Saml2Request saml2RequestResponse, string messageName)
5353
{
5454
yield return string.Join("=", messageName, Uri.EscapeDataString(CompressRequest()));
5555

@@ -58,7 +58,7 @@ private IEnumerable<string> RequestQueryString(X509Certificate2 signingCertifica
5858
yield return string.Join("=", Saml2Constants.Message.RelayState, Uri.EscapeDataString(RelayState));
5959
}
6060

61-
if(signingCertificate != null)
61+
if (!(saml2RequestResponse is Saml2AuthnRequest) && saml2RequestResponse.Config.SigningCertificate != null)
6262
{
6363
yield return string.Join("=", Saml2Constants.Message.SigAlg, Uri.EscapeDataString(SignatureAlgorithm));
6464
}
@@ -88,12 +88,13 @@ protected override Saml2Request UnbindInternal(HttpRequest request, Saml2Request
8888
if (!request.Query.AllKeys.Contains(messageName))
8989
throw new Saml2BindingException("HTTP Query String does not contain " + messageName);
9090

91-
if (saml2RequestResponse.Config.SignatureValidationCertificates != null && saml2RequestResponse.Config.SignatureValidationCertificates.Count() > 0)
91+
if (!(saml2RequestResponse is Saml2AuthnRequest) &&
92+
saml2RequestResponse.Config.SignatureValidationCertificates != null && saml2RequestResponse.Config.SignatureValidationCertificates.Count() > 0)
9293
{
93-
if(!request.Query.AllKeys.Contains(Saml2Constants.Message.Signature))
94+
if (!request.Query.AllKeys.Contains(Saml2Constants.Message.Signature))
9495
throw new Saml2BindingException("HTTP Query String does not contain " + Saml2Constants.Message.Signature);
9596

96-
if(!request.Query.AllKeys.Contains(Saml2Constants.Message.SigAlg))
97+
if (!request.Query.AllKeys.Contains(Saml2Constants.Message.SigAlg))
9798
throw new Saml2BindingException("HTTP Query String does not contain " + Saml2Constants.Message.SigAlg);
9899
}
99100

@@ -102,7 +103,8 @@ protected override Saml2Request UnbindInternal(HttpRequest request, Saml2Request
102103
RelayState = request.Query[Saml2Constants.Message.RelayState];
103104
}
104105

105-
if (saml2RequestResponse.Config.SignatureValidationCertificates != null && saml2RequestResponse.Config.SignatureValidationCertificates.Count() > 0)
106+
if (!(saml2RequestResponse is Saml2AuthnRequest) &&
107+
saml2RequestResponse.Config.SignatureValidationCertificates != null && saml2RequestResponse.Config.SignatureValidationCertificates.Count() > 0)
106108
{
107109
var actualAignatureAlgorithm = request.Query[Saml2Constants.Message.SigAlg];
108110
if (saml2RequestResponse.Config.SignatureAlgorithm == null)

src/ITfoxtec.Identity.Saml2/Request/Saml2Request.cs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ namespace ITfoxtec.Identity.Saml2
1717
/// Generic Saml2 Request.
1818
/// </summary>
1919
public abstract class Saml2Request
20-
{
20+
{
2121
public Saml2Configuration Config { get; protected set; }
2222

2323
public XmlDocument XmlDocument { get; protected set; }
@@ -105,7 +105,7 @@ public string IdAsString
105105

106106
public IEnumerable<X509Certificate2> SignatureValidationCertificates { get; set; }
107107

108-
public string SignatureAlgorithm { get; set; }
108+
public string SignatureAlgorithm { get; set; }
109109

110110
internal IdentityConfiguration IdentityConfiguration { get; private set; }
111111

@@ -151,7 +151,7 @@ protected virtual IEnumerable<XObject> GetXContent()
151151
if (Extensions != null)
152152
{
153153
yield return Extensions.ToXElement();
154-
}
154+
}
155155
}
156156

157157
public abstract XmlDocument ToXml();
@@ -161,7 +161,7 @@ protected internal virtual void Read(string xml, bool validateXmlSignature)
161161
#if DEBUG
162162
Debug.WriteLine("Saml2P: " + xml);
163163
#endif
164-
164+
165165
XmlDocument = xml.ToXmlDocument();
166166

167167
if (XmlDocument.DocumentElement.NamespaceURI != Saml2Constants.ProtocolNamespace.OriginalString)
@@ -186,14 +186,14 @@ protected internal virtual void Read(string xml, bool validateXmlSignature)
186186
Destination = XmlDocument.DocumentElement.Attributes[Saml2Constants.Message.Destination].GetValueOrNull<Uri>();
187187

188188
var extensionsData = XmlDocument.DocumentElement[Saml2Constants.Message.Extensions, Saml2Constants.ProtocolNamespace.OriginalString].GetValueOrNull<string>();
189-
if(extensionsData != null)
189+
if (extensionsData != null)
190190
{
191191
Extensions = new Schemas.Extensions { Data = extensionsData };
192192
}
193193

194194
DecryptMessage();
195195

196-
if (validateXmlSignature)
196+
if (!(this is Saml2AuthnRequest) && validateXmlSignature)
197197
{
198198
ValidateXmlSignature();
199199
}
@@ -212,25 +212,25 @@ protected virtual XmlElement GetAssertionElement()
212212
private void ValidateXmlSignature()
213213
{
214214
var assertionElement = GetAssertionElement();
215-
if(assertionElement == null)
215+
if (assertionElement == null)
216216
{
217217
if (ValidateXmlSignature(XmlDocument.DocumentElement) != SignatureValidation.Valid)
218-
throw new Saml2RequestException("Signature is invalid.");
218+
throw new Saml2RequestException("Signature is invalid.");
219219
}
220220
else
221221
{
222222
var documentValidationResult = ValidateXmlSignature(XmlDocument.DocumentElement);
223223
var assertionValidationResult = ValidateXmlSignature(assertionElement);
224-
if (documentValidationResult == SignatureValidation.Invalid || assertionValidationResult == SignatureValidation.Invalid ||
224+
if (documentValidationResult == SignatureValidation.Invalid || assertionValidationResult == SignatureValidation.Invalid ||
225225
!(documentValidationResult == SignatureValidation.Valid || assertionValidationResult == SignatureValidation.Valid))
226226
throw new Saml2RequestException("Signature is invalid.");
227-
}
227+
}
228228
}
229229

230230
protected SignatureValidation ValidateXmlSignature(XmlElement xmlElement)
231231
{
232232
var xmlSignatures = xmlElement.SelectNodes($"*[local-name()='{Saml2Constants.Message.Signature}' and namespace-uri()='{Saml2SignedXml.XmlDsigNamespaceUrl}']");
233-
if(xmlSignatures.Count == 0)
233+
if (xmlSignatures.Count == 0)
234234
{
235235
return SignatureValidation.NotPresent;
236236
}

0 commit comments

Comments
 (0)