Skip to content

Commit d3b05f8

Browse files
committed
Issuer, EntityID and AllowedAudienceUris support string values and do not require a URI.
Full support in .NET Core. AllowedAudienceUris as string values is not supported in .NET Framework.
1 parent df95533 commit d3b05f8

File tree

15 files changed

+44
-44
lines changed

15 files changed

+44
-44
lines changed

src/ITfoxtec.Identity.Saml2.Mvc/ITfoxtec.Identity.Saml2.Mvc.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,10 @@
1616
<PackageTags>SAML SAML2.0 SAML2 SAML-P SAMLP SSO Identity Provider (IdP) and Relying Party (RP) Authentication Metadata OIOSAML NemLog-in ASP.NET MVC</PackageTags>
1717
<NeutralLanguage>en-US</NeutralLanguage>
1818
<PackageIconUrl>https://itfoxtec.com/favicon.ico</PackageIconUrl>
19-
<AssemblyVersion>3.1.0.1</AssemblyVersion>
20-
<FileVersion>3.1.0.1</FileVersion>
19+
<AssemblyVersion>3.1.0.3</AssemblyVersion>
20+
<FileVersion>3.1.0.3</FileVersion>
2121
<Copyright>Copyright © 2019</Copyright>
22-
<Version>3.1.0.0-beta2</Version>
22+
<Version>3.1.0.3-beta3</Version>
2323
<SignAssembly>true</SignAssembly>
2424
<AssemblyOriginatorKeyFile>ITfoxtec.SAML2.snk</AssemblyOriginatorKeyFile>
2525
<DelaySign>false</DelaySign>

src/ITfoxtec.Identity.Saml2.MvcCore/ITfoxtec.Identity.Saml2.MvcCore.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,10 @@
1717
<PackageTags>SAML SAML2.0 SAML2 SAML-P SAMLP SSO Identity Provider (IdP) Relying Party (RP) Authentication Metadata OIOSAML NemLog-in ASP.NET MVC Core</PackageTags>
1818
<NeutralLanguage>en-US</NeutralLanguage>
1919
<PackageIconUrl>https://itfoxtec.com/favicon.ico</PackageIconUrl>
20-
<AssemblyVersion>3.1.0.1</AssemblyVersion>
21-
<FileVersion>3.1.0.1</FileVersion>
20+
<AssemblyVersion>3.1.0.3</AssemblyVersion>
21+
<FileVersion>3.1.0.3</FileVersion>
2222
<Copyright>Copyright © 2019</Copyright>
23-
<Version>3.1.0.0-beta2</Version>
23+
<Version>3.1.0.3-beta3</Version>
2424
<SignAssembly>true</SignAssembly>
2525
<AssemblyOriginatorKeyFile>ITfoxtec.SAML2.snk</AssemblyOriginatorKeyFile>
2626
<DelaySign>false</DelaySign>

src/ITfoxtec.Identity.Saml2/Configuration/Saml2Configuration.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ namespace ITfoxtec.Identity.Saml2
1111
/// </summary>
1212
public class Saml2Configuration
1313
{
14-
public Uri Issuer { get; set; }
14+
public string Issuer { get; set; }
1515

1616
public Uri SingleSignOnDestination { get; set; }
1717

@@ -31,7 +31,7 @@ public class Saml2Configuration
3131
public bool DetectReplayedTokens { get; set; } = false;
3232

3333
public bool AudienceRestricted { get; set; } = true;
34-
public List<Uri> AllowedAudienceUris { get; protected set; } = new List<Uri>();
34+
public List<string> AllowedAudienceUris { get; protected set; } = new List<string>();
3535

3636
public bool SignAuthnRequest { get; set; } = false;
3737
}

src/ITfoxtec.Identity.Saml2/Configuration/Saml2IdentityConfiguration.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,8 @@ public static Saml2IdentityConfiguration GetIdentityConfiguration(Saml2Configura
4242
#else
4343
configuration.SaveSigninToken = config.SaveBootstrapContext;
4444
configuration.ValidateAudience = config.AudienceRestricted;
45-
configuration.ValidAudiences = config.AllowedAudienceUris.Select(a => a.OriginalString);
46-
configuration.ValidIssuer = config.Issuer?.OriginalString;
45+
configuration.ValidAudiences = config.AllowedAudienceUris.Select(a => a);
46+
configuration.ValidIssuer = config.Issuer;
4747
configuration.ValidateTokenReplay = config.DetectReplayedTokens;
4848

4949
configuration.NameClaimType = ClaimTypes.NameIdentifier;
@@ -58,14 +58,14 @@ public static Saml2IdentityConfiguration GetIdentityConfiguration(Saml2Configura
5858
}
5959

6060
#if NETFULL
61-
private static AudienceRestriction GetAudienceRestriction(bool audienceRestricted, IEnumerable<Uri> allowedAudienceUris)
61+
private static AudienceRestriction GetAudienceRestriction(bool audienceRestricted, IEnumerable<string> allowedAudienceUris)
6262
{
6363
var audienceRestriction = new AudienceRestriction(audienceRestricted ? System.IdentityModel.Selectors.AudienceUriMode.Always : System.IdentityModel.Selectors.AudienceUriMode.Never);
6464
if (audienceRestricted)
6565
{
6666
foreach (var audienceUri in allowedAudienceUris)
6767
{
68-
audienceRestriction.AllowedAudienceUris.Add(audienceUri);
68+
audienceRestriction.AllowedAudienceUris.Add(new Uri(audienceUri));
6969
}
7070
}
7171
return audienceRestriction;

src/ITfoxtec.Identity.Saml2/ITfoxtec.Identity.Saml2.csproj

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@
1919
<PackageTags>SAML SAML2.0 SAML2 SAML-P SAMLP SSO Identity Provider (IdP) Relying Party (RP) Authentication Metadata OIOSAML NemLog-in</PackageTags>
2020
<NeutralLanguage>en-US</NeutralLanguage>
2121
<PackageIconUrl>https://itfoxtec.com/favicon.ico</PackageIconUrl>
22-
<AssemblyVersion>3.1.0.1</AssemblyVersion>
23-
<FileVersion>3.1.0.1</FileVersion>
22+
<AssemblyVersion>3.1.0.3</AssemblyVersion>
23+
<FileVersion>3.1.0.3</FileVersion>
2424
<Copyright>Copyright © 2019</Copyright>
25-
<Version>3.1.0.0-beta2</Version>
25+
<Version>3.1.0.3-beta3</Version>
2626
<SignAssembly>true</SignAssembly>
2727
<AssemblyOriginatorKeyFile>ITfoxtec.SAML2.snk</AssemblyOriginatorKeyFile>
2828
<DelaySign>false</DelaySign>

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

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ protected override void ValidateElementName()
8888
/// <param name="subjectConfirmationLifetime">The Subject Confirmation Lifetime in minutes.</param>
8989
/// <param name="issuedTokenLifetime">The Issued Token Lifetime in minutes.</param>
9090
/// <returns>The SAML 2.0 Security Token.</returns>
91-
public Saml2SecurityToken CreateSecurityToken(Uri appliesToAddress, Uri authnContext = null, int subjectConfirmationLifetime = 5, int issuedTokenLifetime = 60)
91+
public Saml2SecurityToken CreateSecurityToken(string appliesToAddress, Uri authnContext = null, int subjectConfirmationLifetime = 5, int issuedTokenLifetime = 60)
9292
{
9393
if (appliesToAddress == null) throw new ArgumentNullException(nameof(appliesToAddress));
9494
if (ClaimsIdentity == null) throw new ArgumentNullException("ClaimsIdentity property");
@@ -125,7 +125,7 @@ public Saml2SecurityToken CreateSecurityToken(SecurityTokenDescriptor tokenDescr
125125
return Saml2SecurityToken;
126126
}
127127

128-
protected virtual SecurityTokenDescriptor CreateTokenDescriptor(IEnumerable<Claim> claims, Uri appliesToAddress, int issuedTokenLifetime)
128+
protected virtual SecurityTokenDescriptor CreateTokenDescriptor(IEnumerable<Claim> claims, string appliesToAddress, int issuedTokenLifetime)
129129
{
130130
if (Issuer == null) throw new ArgumentNullException("Issuer property");
131131

@@ -135,12 +135,12 @@ protected virtual SecurityTokenDescriptor CreateTokenDescriptor(IEnumerable<Clai
135135
#if NETFULL
136136
tokenDescriptor.TokenType = Schemas.SamlTokenTypes.Saml2TokenProfile11.OriginalString;
137137
tokenDescriptor.Lifetime = new Lifetime(now.UtcDateTime, now.AddMinutes(issuedTokenLifetime).UtcDateTime);
138-
tokenDescriptor.AppliesToAddress = appliesToAddress.OriginalString;
139-
tokenDescriptor.TokenIssuerName = Issuer.OriginalString;
138+
tokenDescriptor.AppliesToAddress = appliesToAddress;
139+
tokenDescriptor.TokenIssuerName = Issuer;
140140
#else
141141
tokenDescriptor.Expires = now.AddMinutes(issuedTokenLifetime).UtcDateTime;
142-
tokenDescriptor.Audience = appliesToAddress.OriginalString;
143-
tokenDescriptor.Issuer = Issuer.OriginalString;
142+
tokenDescriptor.Audience = appliesToAddress;
143+
tokenDescriptor.Issuer = Issuer;
144144
#endif
145145
return tokenDescriptor;
146146
}

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

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public string IdAsString
8282
/// Identifies the entity that generated the response message. (For more information on this element, see
8383
/// Section 2.2.5.)
8484
/// </summary>
85-
public Uri Issuer { get; set; }
85+
public string Issuer { get; set; }
8686

8787
/// <summary>
8888
/// [Optional]
@@ -149,7 +149,7 @@ protected virtual IEnumerable<XObject> GetXContent()
149149

150150
if (Issuer != null)
151151
{
152-
yield return new XElement(Schemas.Saml2Constants.AssertionNamespaceX + Schemas.Saml2Constants.Message.Issuer, Issuer.OriginalString);
152+
yield return new XElement(Schemas.Saml2Constants.AssertionNamespaceX + Schemas.Saml2Constants.Message.Issuer, Issuer);
153153
}
154154

155155
if (Extensions != null)
@@ -185,7 +185,7 @@ protected internal virtual void Read(string xml, bool validateXmlSignature)
185185

186186
IssueInstant = XmlDocument.DocumentElement.Attributes[Schemas.Saml2Constants.Message.IssueInstant].GetValueOrNull<DateTimeOffset>();
187187

188-
Issuer = XmlDocument.DocumentElement[Schemas.Saml2Constants.Message.Issuer, Schemas.Saml2Constants.AssertionNamespace.OriginalString].GetValueOrNull<Uri>();
188+
Issuer = XmlDocument.DocumentElement[Schemas.Saml2Constants.Message.Issuer, Schemas.Saml2Constants.AssertionNamespace.OriginalString].GetValueOrNull<string>();
189189

190190
Destination = XmlDocument.DocumentElement.Attributes[Schemas.Saml2Constants.Message.Destination].GetValueOrNull<Uri>();
191191

src/ITfoxtec.Identity.Saml2/Schemas/Metadata/EntityDescriptor.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class EntityDescriptor
2626
/// <summary>
2727
/// Specifies the unique identifier of the SAML entity whose metadata is described by the element's contents.
2828
/// </summary>
29-
public Uri EntityId { get; protected set; }
29+
public string EntityId { get; protected set; }
3030

3131
/// <summary>
3232
/// A document-unique identifier for the element, typically used as a reference point when signing.
@@ -115,7 +115,7 @@ protected IEnumerable<XObject> GetXContent()
115115
{
116116
throw new ArgumentNullException("EntityId property");
117117
}
118-
yield return new XAttribute(Saml2MetadataConstants.Message.EntityId, EntityId.OriginalString);
118+
yield return new XAttribute(Saml2MetadataConstants.Message.EntityId, EntityId);
119119
yield return new XAttribute(Saml2MetadataConstants.Message.Id, IdAsString);
120120
if (ValidUntil.HasValue)
121121
{
@@ -148,7 +148,7 @@ public virtual EntityDescriptor ReadIdPSsoDescriptor(string idPMetadataXml)
148148
throw new Saml2RequestException("Not Metadata.");
149149
}
150150

151-
EntityId = metadataXmlDocument.DocumentElement.Attributes[Saml2MetadataConstants.Message.EntityId].GetValueOrNull<Uri>();
151+
EntityId = metadataXmlDocument.DocumentElement.Attributes[Saml2MetadataConstants.Message.EntityId].GetValueOrNull<string>();
152152

153153
Id = metadataXmlDocument.DocumentElement.Attributes[Saml2MetadataConstants.Message.Id].GetValueOrNull<Saml2Id>();
154154

test/TestIdPCore/Controllers/AuthController.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,12 @@ public IActionResult Logout()
8080
}
8181
}
8282

83-
private Uri ReadRelyingPartyFromLoginRequest<T>(Saml2Binding<T> binding)
83+
private string ReadRelyingPartyFromLoginRequest<T>(Saml2Binding<T> binding)
8484
{
8585
return binding.ReadSamlRequest(Request.ToGenericHttpRequest(), new Saml2AuthnRequest(config))?.Issuer;
8686
}
8787

88-
private Uri ReadRelyingPartyFromLogoutRequest<T>(Saml2Binding<T> binding)
88+
private string ReadRelyingPartyFromLogoutRequest<T>(Saml2Binding<T> binding)
8989
{
9090
return binding.ReadSamlRequest(Request.ToGenericHttpRequest(), new Saml2LogoutRequest(config))?.Issuer;
9191
}
@@ -131,37 +131,37 @@ private IActionResult LogoutResponse(Saml2Id inResponseTo, Saml2StatusCodes stat
131131
return responsebinding.Bind(saml2LogoutResponse).ToActionResult();
132132
}
133133

134-
private RelyingParty ValidateRelyingParty(Uri issuer)
134+
private RelyingParty ValidateRelyingParty(string issuer)
135135
{
136136
var validRelyingPartys = new List<RelyingParty>();
137137
validRelyingPartys.Add(new RelyingParty
138138
{
139-
Issuer = new Uri("urn:itfoxtec:identity:saml2:testwebapp"),
139+
Issuer = "urn:itfoxtec:identity:saml2:testwebapp",
140140
SingleSignOnDestination = new Uri("http://localhost:3112/Auth/AssertionConsumerService"),
141141
SingleLogoutResponseDestination = new Uri("http://localhost:3112/Auth/LoggedOut"),
142142
SignatureValidationCertificate = CertificateUtil.Load(Startup.AppEnvironment.MapToPhysicalFilePath("itfoxtec.identity.saml2.testwebapp_Certificate.crt"))
143143
});
144144
validRelyingPartys.Add(new RelyingParty
145145
{
146-
Issuer = new Uri("urn:itfoxtec:identity:saml2:testwebappcore"),
146+
Issuer = "itfoxtec-testwebappcore",
147147
SingleSignOnDestination = new Uri("https://localhost:44306/Auth/AssertionConsumerService"),
148148
SingleLogoutResponseDestination = new Uri("https://localhost:44306/Auth/LoggedOut"),
149149
SignatureValidationCertificate = CertificateUtil.Load(Startup.AppEnvironment.MapToPhysicalFilePath("itfoxtec.identity.saml2.testwebappcore_Certificate.crt"))
150150
});
151151
validRelyingPartys.Add(new RelyingParty
152152
{
153-
Issuer = new Uri("urn:itfoxtec:identity:saml2:testwebappcoreframework"),
153+
Issuer = "urn:itfoxtec:identity:saml2:testwebappcoreframework",
154154
SingleSignOnDestination = new Uri("https://localhost:44307/Auth/AssertionConsumerService"),
155155
SingleLogoutResponseDestination = new Uri("https://localhost:44307/Auth/LoggedOut"),
156156
SignatureValidationCertificate = CertificateUtil.Load(Startup.AppEnvironment.MapToPhysicalFilePath("itfoxtec.identity.saml2.testwebappcore_Certificate.crt"))
157157
});
158158

159-
return validRelyingPartys.Where(rp => rp.Issuer.OriginalString.Equals(issuer.OriginalString, StringComparison.InvariantCultureIgnoreCase)).Single();
159+
return validRelyingPartys.Where(rp => rp.Issuer.Equals(issuer, StringComparison.InvariantCultureIgnoreCase)).Single();
160160
}
161161

162162
class RelyingParty
163163
{
164-
public Uri Issuer { get; set; }
164+
public string Issuer { get; set; }
165165

166166
public Uri SingleSignOnDestination { get; set; }
167167

test/TestIdPCore/appsettings.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
}
99
},
1010
"Saml2": {
11-
"Issuer": "urn:itfoxtec:identity:saml2:testidpcore",
11+
"Issuer": "itfoxtec-testidpcore",
1212
"SingleSignOnDestination": "https://localhost:44305/Auth/Login",
1313
"SingleLogoutDestination": "https://localhost:44305/Auth/Logout",
1414
"SignatureAlgorithm": "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256",

0 commit comments

Comments
 (0)