Skip to content

Commit

Permalink
ReqeustAbstractType.Extensions
Browse files Browse the repository at this point in the history
- Fixes #598
  • Loading branch information
AndersAbel committed Jun 25, 2019
2 parents 96ad3fa + b069256 commit d0e98fd
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 5 deletions.
22 changes: 20 additions & 2 deletions Sustainsys.Saml2/SAML2P/Saml2RequestBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,11 @@ public string MessageName
/// </summary>
public EntityId Issuer { get; set; }

/// <summary>
/// The additional content to append within an Extensions element.
/// </summary>
public List<XElement> ExtensionContents { get; } = new List<XElement>();

/// <summary>
/// The SAML2 request name
/// </summary>
Expand Down Expand Up @@ -109,6 +114,11 @@ protected IEnumerable<XObject> ToXNodes()
{
yield return new XElement(Saml2Namespaces.Saml2 + "Issuer", Issuer.Id);
}

if (ExtensionContents != null && ExtensionContents.Count > 0)
{
yield return new XElement(Saml2Namespaces.Saml2P + "Extensions", ExtensionContents);
}
}

/// <summary>
Expand All @@ -126,16 +136,24 @@ protected void ReadBaseProperties(XmlElement xml)
Id = new Saml2Id(xml.Attributes["ID"].Value);

var destination = xml.Attributes["Destination"];
if(destination != null)
if (destination != null)
{
DestinationUrl = new Uri(destination.Value);
}

var issuerNode = xml["Issuer", Saml2Namespaces.Saml2Name];
if(issuerNode != null)
if (issuerNode != null)
{
Issuer = new EntityId(issuerNode.InnerXml);
}

var extensionsNode = xml["Extensions", Saml2Namespaces.Saml2PName];
if (extensionsNode != null && extensionsNode.HasChildNodes)
{
XElement converted = XElement.Parse(extensionsNode.OuterXml);
ExtensionContents.Clear();
ExtensionContents.AddRange(converted.Elements());
}
}

private void ValidateCorrectDocument(XmlElement xml)
Expand Down
46 changes: 43 additions & 3 deletions Tests/Tests.Shared/Saml2P/Saml2AuthenticationRequestTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ public void Saml2AuthenticationRequest_AssertionConsumerServiceUrl()
[TestMethod]
public void Saml2AuthenticationRequest_ForceAuthentication_OmittedIfFalse()
{
var subject = new Saml2AuthenticationRequest() {
var subject = new Saml2AuthenticationRequest()
{
ForceAuthentication = false
}.ToXElement();

Expand All @@ -72,14 +73,28 @@ public void Saml2AuthenticationRequest_ForceAuthentication_OmittedIfFalse()
[TestMethod]
public void Saml2AuthenticationRequest_ForceAuthentication()
{
var subject = new Saml2AuthenticationRequest() {
var subject = new Saml2AuthenticationRequest()
{
ForceAuthentication = true
}.ToXElement();

subject.Should().NotBeNull().And.Subject.Attribute("ForceAuthn")
.Should().NotBeNull().And.Subject.Value.Should().Be("true");
}

[TestMethod]
public void Saml2AuthenticationRequest_Extensions()
{
var request = new Saml2AuthenticationRequest();
request.ExtensionContents.Add(new XElement(XNamespace.Get("test") + "aditional"));
var subject = request.ToXElement();

subject.Should().NotBeNull().And.Subject
.Element(Saml2Namespaces.Saml2P + "Extensions").Should().NotBeNull().And.Subject
.Elements().Should().HaveCount(1).And.Subject
.First().Name.LocalName.Should().Be("aditional");
}

[TestMethod]
public void Saml2AuthenticationRequest_Read()
{
Expand Down Expand Up @@ -218,6 +233,31 @@ public void Saml2AuthenticationRequest_Read_NoFormat()
subject.NameIdPolicy.Format.Should().Be(NameIdFormat.NotConfigured);
}

[TestMethod]
public void Saml2AuthenticationRequest_Read_Extensions()
{
var xmlData = @"<?xml version=""1.0"" encoding=""UTF-8""?>
<samlp:AuthnRequest
xmlns:samlp=""urn:oasis:names:tc:SAML:2.0:protocol""
xmlns:saml=""urn:oasis:names:tc:SAML:2.0:assertion""
ID=""Saml2AuthenticationRequest_AssertionConsumerServiceUrl""
Version=""2.0""
Destination=""http://destination.example.com""
AssertionConsumerServiceURL=""https://sp.example.com/SAML2/Acs""
IssueInstant=""2004-12-05T09:21:59Z""
ForceAuthn=""true"">
<saml:Issuer>https://sp.example.com/SAML2</saml:Issuer>
<samlp:Extensions>
<additional xmlns=""testurn:test"" />
</samlp:Extensions>
</samlp:AuthnRequest>
";

var subject = Saml2AuthenticationRequest.Read(xmlData, null);
subject.ExtensionContents.Should().HaveCount(1);
subject.ExtensionContents[0].ToString().Should().BeEquivalentTo(@"<additional xmlns=""testurn:test"" />");
}

[TestMethod]
public void Saml2AuthenticationRequest_ToXElement_AddsElementSaml2NameIdPolicy_ForAllowCreate()
{
Expand Down Expand Up @@ -305,7 +345,7 @@ public void Saml2AuthenticationRequest_ToXElement_Scoping_ZeroProxyCount_Attribu
ProxyCount = 0
}
};

var actual = subject.ToXElement().Element(Saml2Namespaces.Saml2P + "Scoping");

var expected = new XElement(Saml2Namespaces.Saml2P + "root",
Expand Down

0 comments on commit d0e98fd

Please sign in to comment.