From 8be3c2b80070a7b8419965bc73831c9d693bf67a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=BDygimantas=20=C5=A0alkus?= Date: Tue, 3 Nov 2020 19:58:42 +0200 Subject: [PATCH] Downgrade to .NET standard 2.0 --- .../Args/AccessTokenRequestArgs.cs | 2 +- .../Responses/AccessTokenResponse.cs | 6 ++- .../Args/CapabilitiesRequestArgs.cs | 2 +- iSHARE/IShareSettings.cs | 4 +- .../IdentityProvidersQueryService.cs | 8 ++-- .../GenericHttpClient/TokenResponseClient.cs | 26 +++++----- iSHARE/Parties/PartiesQueryService.cs | 2 +- iSHARE/TokenConvert.cs | 2 +- iSHARE/TokenValidator/CertificateUtilities.cs | 8 ++-- iSHARE/TokenValidator/DecodedJwtValidator.cs | 12 ++--- .../TokenValidator/JwtCertificateValidator.cs | 48 ++++++++++--------- .../SchemeOwnerJwtTokenResponseValidator.cs | 46 +++++++++--------- .../TestCaStrategy/ITestCaStrategy.cs | 4 +- iSHARE/iSHARE.csproj | 3 +- 14 files changed, 92 insertions(+), 81 deletions(-) diff --git a/iSHARE/AccessToken/Args/AccessTokenRequestArgs.cs b/iSHARE/AccessToken/Args/AccessTokenRequestArgs.cs index 481e9f2..79bfc88 100644 --- a/iSHARE/AccessToken/Args/AccessTokenRequestArgs.cs +++ b/iSHARE/AccessToken/Args/AccessTokenRequestArgs.cs @@ -37,7 +37,7 @@ public AccessTokenRequestArgs(string requestUri, string clientId, string clientA private static void ValidateArguments(string requestUri, string clientId, string clientAssertion) { - static void ValidateSingle(string value, string nameOf) + void ValidateSingle(string value, string nameOf) { if (string.IsNullOrWhiteSpace(value)) { diff --git a/iSHARE/AccessToken/Responses/AccessTokenResponse.cs b/iSHARE/AccessToken/Responses/AccessTokenResponse.cs index d4ac4c0..4f4dc91 100644 --- a/iSHARE/AccessToken/Responses/AccessTokenResponse.cs +++ b/iSHARE/AccessToken/Responses/AccessTokenResponse.cs @@ -21,8 +21,10 @@ public class AccessTokenResponse public static async Task FromHttpContentAsync(HttpContent httpContent) { - await using var responseStream = await httpContent.ReadAsStreamAsync(); - return await JsonSerializer.DeserializeAsync(responseStream); + using (var responseStream = await httpContent.ReadAsStreamAsync()) + { + return await JsonSerializer.DeserializeAsync(responseStream); + } } } } diff --git a/iSHARE/Capabilities/Args/CapabilitiesRequestArgs.cs b/iSHARE/Capabilities/Args/CapabilitiesRequestArgs.cs index 92193e0..b8abbee 100644 --- a/iSHARE/Capabilities/Args/CapabilitiesRequestArgs.cs +++ b/iSHARE/Capabilities/Args/CapabilitiesRequestArgs.cs @@ -61,7 +61,7 @@ private static void ValidateArguments( string schemeOwnerAccessToken, string accessToken) { - static void EnsureValidString(string name, string value) + void EnsureValidString(string name, string value) { if (string.IsNullOrWhiteSpace(value)) { diff --git a/iSHARE/IShareSettings.cs b/iSHARE/IShareSettings.cs index 52f89d4..fdd1163 100644 --- a/iSHARE/IShareSettings.cs +++ b/iSHARE/IShareSettings.cs @@ -2,11 +2,11 @@ { public interface IShareSettings { - public string SchemeOwnerUrl { get; } + string SchemeOwnerUrl { get; } /// /// Your organization's EORI number. Used to verify if JWT token audience is correct. /// - public string Eori { get; } + string Eori { get; } } } diff --git a/iSHARE/IdentityProviders/IdentityProvidersQueryService.cs b/iSHARE/IdentityProviders/IdentityProvidersQueryService.cs index 19d8a9e..4c9d3e2 100644 --- a/iSHARE/IdentityProviders/IdentityProvidersQueryService.cs +++ b/iSHARE/IdentityProviders/IdentityProvidersQueryService.cs @@ -64,7 +64,7 @@ private static string FormatIdpUri(string uri) private async Task> RetrieveIdpPartiesAsync(string accessToken, CancellationToken token) { - static bool IsValidIdp(Party party) + bool IsValidIdp(Party party) { var certification = party.Certifications.FirstOrDefault(c => c.Role == IdentityProvider); if (certification == null) @@ -93,10 +93,10 @@ private async Task> RetrieveAllPartiesAsync( PartiesResponse partiesResponse, CancellationToken token) { - static int CalculateTotalPages(PartiesResponse partiesResponse) + int CalculateTotalPages(PartiesResponse innerPartiesResponse) { - var pagesCount = partiesResponse.Count / 10; - if (partiesResponse.Count % 10 != 0) + var pagesCount = innerPartiesResponse.Count / 10; + if (innerPartiesResponse.Count % 10 != 0) { pagesCount++; } diff --git a/iSHARE/Internals/GenericHttpClient/TokenResponseClient.cs b/iSHARE/Internals/GenericHttpClient/TokenResponseClient.cs index a1c3262..e300e72 100644 --- a/iSHARE/Internals/GenericHttpClient/TokenResponseClient.cs +++ b/iSHARE/Internals/GenericHttpClient/TokenResponseClient.cs @@ -49,20 +49,22 @@ private static string AppendParametersIfNeeded( private static async Task ExtractToken(HttpContent httpContent, CancellationToken token) { - await using var responseStream = await httpContent.ReadAsStreamAsync(); - var response = await JsonSerializer.DeserializeAsync>( - responseStream, - cancellationToken: token); - - var tokenPair = response.FirstOrDefault(x => x.Key.EndsWith("_token")); - if (WasTokenFound(tokenPair)) + using (var responseStream = await httpContent.ReadAsStreamAsync()) { - return tokenPair.Value; - } + var response = await JsonSerializer.DeserializeAsync>( + responseStream, + cancellationToken: token); - var msg = $"Token with suffix '_token' was not found.{Environment.NewLine}" + - $"Response: {JsonSerializer.Serialize(response)}"; - throw new TokenNotFoundException(msg); + var tokenPair = response.FirstOrDefault(x => x.Key.EndsWith("_token")); + if (WasTokenFound(tokenPair)) + { + return tokenPair.Value; + } + + var msg = $"Token with suffix '_token' was not found.{Environment.NewLine}" + + $"Response: {JsonSerializer.Serialize(response)}"; + throw new TokenNotFoundException(msg); + } } private static bool WasTokenFound(KeyValuePair tokenPair) diff --git a/iSHARE/Parties/PartiesQueryService.cs b/iSHARE/Parties/PartiesQueryService.cs index f48d2dc..a062ba4 100644 --- a/iSHARE/Parties/PartiesQueryService.cs +++ b/iSHARE/Parties/PartiesQueryService.cs @@ -87,7 +87,7 @@ void AddParameter(string name, bool? value) AddParameter("certified_only", args.CertifiedOnly); AddParameter("active_only", args.ActiveOnly); AddParameterIfExists("certificate_subject_name", args.CertificateSubjectName); - AddParameterIfExists("page", args.Page == null ? null : args.Page.ToString()); + AddParameterIfExists("page", args.Page?.ToString()); AddParameterIfExists("date_time", args.DateTime == null ? null : args.DateTime.Value.ToString("s") + "Z"); return dictionary; diff --git a/iSHARE/TokenConvert.cs b/iSHARE/TokenConvert.cs index edfa1ab..dd5bed4 100644 --- a/iSHARE/TokenConvert.cs +++ b/iSHARE/TokenConvert.cs @@ -43,7 +43,7 @@ public static T DeserializeClaim(JwtSecurityToken jwtToken, string claimName) private static string BuildArrayString(Claim[] claims) { - return $"[{string.Join(',', claims.Select(x => x.Value))}]"; + return $"[{string.Join(",", claims.Select(x => x.Value))}]"; } private static void ValidateArguments(JwtSecurityToken jwtToken, string claimName) diff --git a/iSHARE/TokenValidator/CertificateUtilities.cs b/iSHARE/TokenValidator/CertificateUtilities.cs index 43c0b2d..e0230ee 100644 --- a/iSHARE/TokenValidator/CertificateUtilities.cs +++ b/iSHARE/TokenValidator/CertificateUtilities.cs @@ -42,10 +42,12 @@ public static string GetSha256(this X509Certificate2 cert) throw new ArgumentNullException(nameof(cert)); } - using var hasher = new SHA256Managed(); - var hashBytes = hasher.ComputeHash(cert.RawData); + using (var hasher = new SHA256Managed()) + { + var hashBytes = hasher.ComputeHash(cert.RawData); - return BitConverter.ToString(hashBytes).Replace("-", "", StringComparison.CurrentCultureIgnoreCase); + return BitConverter.ToString(hashBytes).Replace("-", ""); + } } } } diff --git a/iSHARE/TokenValidator/DecodedJwtValidator.cs b/iSHARE/TokenValidator/DecodedJwtValidator.cs index f3b9d06..2f9b10c 100644 --- a/iSHARE/TokenValidator/DecodedJwtValidator.cs +++ b/iSHARE/TokenValidator/DecodedJwtValidator.cs @@ -90,18 +90,18 @@ private static TokenValidationParameters CreateTokenValidationParameters( private static bool IsHeaderInvalid(JwtHeader header) { - static bool IsAlgInvalid(string alg) => alg != SecurityAlgorithms.RsaSha256; - static bool IsTypInvalid(string typ) => typ != "JWT"; + bool IsAlgInvalid(string alg) => alg != SecurityAlgorithms.RsaSha256; + bool IsTypInvalid(string typ) => typ != "JWT"; return IsAlgInvalid(header.Alg) || IsTypInvalid(header.Typ); } private static bool IsPayloadInvalid(JwtPayload payload) { - static bool IsSubInvalid(string sub, string iss) => sub != iss; - static bool IsJtiInvalid(string jti) => string.IsNullOrWhiteSpace(jti); - static bool WasIssuedBeforeNow(int? iat) => iat == null || DateTime.UtcNow.ToEpochTime() < iat; - static bool HasIncorrectExpiration(int? iat, int? exp) => exp - iat != 30; + bool IsSubInvalid(string sub, string iss) => sub != iss; + bool IsJtiInvalid(string jti) => string.IsNullOrWhiteSpace(jti); + bool WasIssuedBeforeNow(int? iat) => iat == null || DateTime.UtcNow.ToEpochTime() < iat; + bool HasIncorrectExpiration(int? iat, int? exp) => exp - iat != 30; return IsSubInvalid(payload.Sub, payload.Iss) || IsJtiInvalid(payload.Jti) diff --git a/iSHARE/TokenValidator/JwtCertificateValidator.cs b/iSHARE/TokenValidator/JwtCertificateValidator.cs index 62cf693..882bbf7 100644 --- a/iSHARE/TokenValidator/JwtCertificateValidator.cs +++ b/iSHARE/TokenValidator/JwtCertificateValidator.cs @@ -63,34 +63,36 @@ public async Task IsValidAsync( private bool IsChainValid(X509Certificate2 primaryCertificate, X509Certificate2[] additionalCertificates) { - using var chain = new X509Chain(); - chain.ChainPolicy.ExtraStore.AddRange(additionalCertificates); - - chain.ChainPolicy.RevocationMode = _testCaStrategy.GetRevocationMode(); - var isValid = chain.Build(primaryCertificate); - if (isValid) + using (var chain = new X509Chain()) { - return true; - } + chain.ChainPolicy.ExtraStore.AddRange(additionalCertificates); - var statuses = chain - .ChainElements - .OfType() - .SelectMany(c => c.ChainElementStatus) - .ToArray(); + chain.ChainPolicy.RevocationMode = _testCaStrategy.GetRevocationMode(); + var isValid = chain.Build(primaryCertificate); + if (isValid) + { + return true; + } - if (_testCaStrategy.ShouldErrorsBeIgnored(statuses)) - { - // allow untrusted root - // for the places where the iSHARE root is not installed (build server) - // even if it's untrusted, trusted list service will do the last check to assure it's actually trusted - isValid = true; - } + var statuses = chain + .ChainElements + .OfType() + .SelectMany(c => c.ChainElementStatus) + .ToArray(); - _logger.LogInformation( - "Chain validation status information {results}.", statuses.Select(c => c.StatusInformation).ToList()); + if (_testCaStrategy.ShouldErrorsBeIgnored(statuses)) + { + // allow untrusted root + // for the places where the iSHARE root is not installed (build server) + // even if it's untrusted, trusted list service will do the last check to assure it's actually trusted + isValid = true; + } - return isValid; + _logger.LogInformation( + "Chain validation status information {results}.", statuses.Select(c => c.StatusInformation).ToList()); + + return isValid; + } } private async Task DoesCertificateBelongToParty( diff --git a/iSHARE/TokenValidator/SchemeOwner/SchemeOwnerJwtTokenResponseValidator.cs b/iSHARE/TokenValidator/SchemeOwner/SchemeOwnerJwtTokenResponseValidator.cs index 4dcf7e8..c331904 100644 --- a/iSHARE/TokenValidator/SchemeOwner/SchemeOwnerJwtTokenResponseValidator.cs +++ b/iSHARE/TokenValidator/SchemeOwner/SchemeOwnerJwtTokenResponseValidator.cs @@ -74,33 +74,35 @@ private TokenValidationArgs CreateTokenValidationArgs(AssertionModel assertionMo private bool IsChainValid(X509Certificate2 primaryCertificate, X509Certificate2[] additionalCertificates) { - using var chain = new X509Chain(); - chain.ChainPolicy.ExtraStore.AddRange(additionalCertificates); - - chain.ChainPolicy.RevocationMode = _testCaStrategy.GetRevocationMode(); - var isValidByPolicy = chain.Build(primaryCertificate); - if (isValidByPolicy) + using (var chain = new X509Chain()) { - return true; - } + chain.ChainPolicy.ExtraStore.AddRange(additionalCertificates); - var statuses = chain - .ChainElements - .OfType() - .SelectMany(c => c.ChainElementStatus) - .ToList(); + chain.ChainPolicy.RevocationMode = _testCaStrategy.GetRevocationMode(); + var isValidByPolicy = chain.Build(primaryCertificate); + if (isValidByPolicy) + { + return true; + } - if (_testCaStrategy.ShouldErrorsBeIgnored(statuses)) - { - // allow untrusted root - // for the places where the iSHARE root is not installed (build server) - isValidByPolicy = true; - } + var statuses = chain + .ChainElements + .OfType() + .SelectMany(c => c.ChainElementStatus) + .ToList(); - _logger.LogInformation( - "Chain validation status information {results}.", statuses.Select(c => c.StatusInformation).ToList()); + if (_testCaStrategy.ShouldErrorsBeIgnored(statuses)) + { + // allow untrusted root + // for the places where the iSHARE root is not installed (build server) + isValidByPolicy = true; + } - return isValidByPolicy; + _logger.LogInformation( + "Chain validation status information {results}.", statuses.Select(c => c.StatusInformation).ToList()); + + return isValidByPolicy; + } } } } \ No newline at end of file diff --git a/iSHARE/TokenValidator/SchemeOwner/TestCaStrategy/ITestCaStrategy.cs b/iSHARE/TokenValidator/SchemeOwner/TestCaStrategy/ITestCaStrategy.cs index 647464b..6f6197d 100644 --- a/iSHARE/TokenValidator/SchemeOwner/TestCaStrategy/ITestCaStrategy.cs +++ b/iSHARE/TokenValidator/SchemeOwner/TestCaStrategy/ITestCaStrategy.cs @@ -10,8 +10,8 @@ namespace iSHARE.TokenValidator.SchemeOwner.TestCaStrategy /// internal interface ITestCaStrategy { - public X509RevocationMode GetRevocationMode(); + X509RevocationMode GetRevocationMode(); - public bool ShouldErrorsBeIgnored(ICollection statuses); + bool ShouldErrorsBeIgnored(ICollection statuses); } } \ No newline at end of file diff --git a/iSHARE/iSHARE.csproj b/iSHARE/iSHARE.csproj index 8c00b4d..caf0d84 100644 --- a/iSHARE/iSHARE.csproj +++ b/iSHARE/iSHARE.csproj @@ -1,7 +1,7 @@  - netcoreapp3.1 + netstandard2.0 @@ -9,6 +9,7 @@ +