diff --git a/src/Directory.Build.targets b/src/Directory.Build.targets index 38e8f1d55..8c3c3133d 100644 --- a/src/Directory.Build.targets +++ b/src/Directory.Build.targets @@ -3,7 +3,7 @@ 10.0.5 10.0.5 - 10.0.5 + 10.0.10 1.0.1-* @@ -61,8 +61,8 @@ - - + + diff --git a/src/EntityFramework.Storage/migrations/Migrator/Migrator.csproj b/src/EntityFramework.Storage/migrations/Migrator/Migrator.csproj index e15481e39..0e6b15c3f 100644 --- a/src/EntityFramework.Storage/migrations/Migrator/Migrator.csproj +++ b/src/EntityFramework.Storage/migrations/Migrator/Migrator.csproj @@ -9,6 +9,7 @@ + diff --git a/src/EntityFramework.Storage/src/Entities/Compatibility/IdentityServerKeyMaterial.cs b/src/EntityFramework.Storage/src/Entities/Compatibility/IdentityServerKeyMaterial.cs index 911f31777..262cb8a14 100644 --- a/src/EntityFramework.Storage/src/Entities/Compatibility/IdentityServerKeyMaterial.cs +++ b/src/EntityFramework.Storage/src/Entities/Compatibility/IdentityServerKeyMaterial.cs @@ -15,7 +15,7 @@ public class IdentityServerKeyMaterial /// /// Get or set unique identifier /// - public string Id { get; set; } + public string Id { get; set; } = null!; /// /// Get or set version of key material @@ -35,7 +35,7 @@ public class IdentityServerKeyMaterial /// /// Get or set key algorithm value /// - public string Algorithm { get; set; } + public string Algorithm { get; set; } = null!; /// /// Get or set is x509 certificate value @@ -45,7 +45,7 @@ public class IdentityServerKeyMaterial /// /// Get or set data value /// - public string Data { get; set; } + public string Data { get; set; } = null!; /// /// Get or set created value diff --git a/src/EntityFramework.Storage/test/IntegrationTests/Open.IdentityServer.EntityFramework.IntegrationTests.csproj b/src/EntityFramework.Storage/test/IntegrationTests/Open.IdentityServer.EntityFramework.IntegrationTests.csproj index 60534d618..0fe620306 100644 --- a/src/EntityFramework.Storage/test/IntegrationTests/Open.IdentityServer.EntityFramework.IntegrationTests.csproj +++ b/src/EntityFramework.Storage/test/IntegrationTests/Open.IdentityServer.EntityFramework.IntegrationTests.csproj @@ -27,6 +27,7 @@ + diff --git a/src/EntityFramework.Storage/test/UnitTests/Open.IdentityServer.EntityFramework.UnitTests.csproj b/src/EntityFramework.Storage/test/UnitTests/Open.IdentityServer.EntityFramework.UnitTests.csproj index bebc111c5..8d15a86af 100644 --- a/src/EntityFramework.Storage/test/UnitTests/Open.IdentityServer.EntityFramework.UnitTests.csproj +++ b/src/EntityFramework.Storage/test/UnitTests/Open.IdentityServer.EntityFramework.UnitTests.csproj @@ -20,6 +20,7 @@ + diff --git a/src/EntityFramework/test/Open.IdentityServer.EntityFramework.Tests/Open.IdentityServer.EntityFramework.Tests.csproj b/src/EntityFramework/test/Open.IdentityServer.EntityFramework.Tests/Open.IdentityServer.EntityFramework.Tests.csproj index 0d6629ff4..2d4b5b5d1 100644 --- a/src/EntityFramework/test/Open.IdentityServer.EntityFramework.Tests/Open.IdentityServer.EntityFramework.Tests.csproj +++ b/src/EntityFramework/test/Open.IdentityServer.EntityFramework.Tests/Open.IdentityServer.EntityFramework.Tests.csproj @@ -15,6 +15,7 @@ + diff --git a/src/Open.IdentityServer/host/Host.csproj b/src/Open.IdentityServer/host/Host.csproj index 9b55fec48..29c8684ca 100644 --- a/src/Open.IdentityServer/host/Host.csproj +++ b/src/Open.IdentityServer/host/Host.csproj @@ -19,6 +19,7 @@ + diff --git a/src/Open.IdentityServer/test/Open.IdentityServer.IntegrationTests/Common/IdentityServerPipeline.cs b/src/Open.IdentityServer/test/Open.IdentityServer.IntegrationTests/Common/IdentityServerPipeline.cs index c5a3b5793..f03d6b190 100644 --- a/src/Open.IdentityServer/test/Open.IdentityServer.IntegrationTests/Common/IdentityServerPipeline.cs +++ b/src/Open.IdentityServer/test/Open.IdentityServer.IntegrationTests/Common/IdentityServerPipeline.cs @@ -315,7 +315,7 @@ public Cookie GetSessionCookie() public string CreateAuthorizeUrl( string clientId = null!, - string? responseType = null, + string responseType = null!, string? scope = null, string? redirectUri = null, string? state = null, diff --git a/src/Open.IdentityServer/test/Open.IdentityServer.IntegrationTests/Endpoints/Introspection/IntrospectionTests.cs b/src/Open.IdentityServer/test/Open.IdentityServer.IntegrationTests/Endpoints/Introspection/IntrospectionTests.cs index b2bb809fa..7d466ad0e 100644 --- a/src/Open.IdentityServer/test/Open.IdentityServer.IntegrationTests/Endpoints/Introspection/IntrospectionTests.cs +++ b/src/Open.IdentityServer/test/Open.IdentityServer.IntegrationTests/Endpoints/Introspection/IntrospectionTests.cs @@ -174,7 +174,7 @@ public async Task Valid_token_and_valid_scope_should_succeed() ClientId = "api1", ClientSecret = "secret", - Token = tokenResponse.AccessToken + Token = tokenResponse.AccessToken ?? string.Empty }, TestContext.Current.CancellationToken); introspectionResponse.IsActive.Should().Be(true); @@ -206,11 +206,12 @@ public async Task Response_data_should_be_valid_using_single_scope() ClientId = "api1", ClientSecret = "secret", - Token = tokenResponse.AccessToken + Token = tokenResponse.AccessToken ?? string.Empty }, TestContext.Current.CancellationToken); var values = introspectionResponse.Json.Deserialize>(); - + + values.Should().NotBeNull(); ((JsonElement)values["aud"]).ValueKind.Should().Be(JsonValueKind.String); ((JsonElement)values["iss"]).ValueKind.Should().Be(JsonValueKind.String); ((JsonElement)values["nbf"]).ValueKind.Should().Be(JsonValueKind.Number); @@ -245,11 +246,12 @@ public async Task Response_data_with_user_authentication_should_be_valid_using_s ClientId = "api1", ClientSecret = "secret", - Token = tokenResponse.AccessToken + Token = tokenResponse.AccessToken ?? string.Empty }, TestContext.Current.CancellationToken); var values = introspectionResponse.Json.Deserialize>(); + values.Should().NotBeNull(); ((JsonElement)values["aud"]).ValueKind.Should().Be(JsonValueKind.String); ((JsonElement)values["iss"]).ValueKind.Should().Be(JsonValueKind.String); ((JsonElement)values["nbf"]).ValueKind.Should().Be(JsonValueKind.Number); @@ -284,11 +286,12 @@ public async Task Response_data_should_be_valid_using_multiple_scopes_multiple_a ClientId = "api3", ClientSecret = "secret", - Token = tokenResponse.AccessToken + Token = tokenResponse.AccessToken ?? string.Empty }, TestContext.Current.CancellationToken); var values = introspectionResponse.Json.Deserialize>(); + values.Should().NotBeNull(); values["aud"].GetType().Name.Should().Be("JsonElement"); var audiences = ((JsonElement)values["aud"]).EnumerateArray(); @@ -329,11 +332,12 @@ public async Task Response_data_should_be_valid_using_multiple_scopes_single_aud ClientId = "api3", ClientSecret = "secret", - Token = tokenResponse.AccessToken + Token = tokenResponse.AccessToken ?? string.Empty }, TestContext.Current.CancellationToken); var values = introspectionResponse.Json.Deserialize>(); + values.Should().NotBeNull(); ((JsonElement)values["aud"]).ValueKind.Should().Be(JsonValueKind.String); ((JsonElement)values["iss"]).ValueKind.Should().Be(JsonValueKind.String); ((JsonElement)values["nbf"]).ValueKind.Should().Be(JsonValueKind.Number); @@ -367,17 +371,17 @@ public async Task Token_with_many_scopes_but_api_should_only_see_its_own_scopes( ClientId = "api3", ClientSecret = "secret", - Token = tokenResponse.AccessToken + Token = tokenResponse.AccessToken ?? string.Empty }, TestContext.Current.CancellationToken); introspectionResponse.IsActive.Should().BeTrue(); introspectionResponse.IsError.Should().BeFalse(); - var scopes = from c in introspectionResponse.Claims + var scopes = (from c in introspectionResponse.Claims where c.Type == "scope" - select c.Value; - - scopes.Count().Should().Be(1); + select c.Value).ToList(); + + scopes.Count.Should().Be(1); scopes.First().Should().Be("api3-a"); } @@ -400,17 +404,17 @@ public async Task Valid_token_with_valid_multiple_scopes() ClientId = "api1", ClientSecret = "secret", - Token = tokenResponse.AccessToken + Token = tokenResponse.AccessToken ?? string.Empty }, TestContext.Current.CancellationToken); introspectionResponse.IsActive.Should().Be(true); introspectionResponse.IsError.Should().Be(false); - var scopes = from c in introspectionResponse.Claims + var scopes = (from c in introspectionResponse.Claims where c.Type == "scope" - select c; + select c).ToList(); - scopes.Count().Should().Be(1); + scopes.Count.Should().Be(1); scopes.First().Value.Should().Be("api1"); } @@ -433,7 +437,7 @@ public async Task Valid_token_with_invalid_scopes_should_fail() ClientId = "api2", ClientSecret = "secret", - Token = tokenResponse.AccessToken + Token = tokenResponse.AccessToken ?? string.Empty }, TestContext.Current.CancellationToken); introspectionResponse.IsActive.Should().Be(false); diff --git a/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/ResponseHandling/TokenResponseGenerator/TokenResponseGeneratorTests_RefreshToken.cs b/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/ResponseHandling/TokenResponseGenerator/TokenResponseGeneratorTests_RefreshToken.cs index 6e25c4ce3..9e5c11aff 100644 --- a/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/ResponseHandling/TokenResponseGenerator/TokenResponseGeneratorTests_RefreshToken.cs +++ b/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/ResponseHandling/TokenResponseGenerator/TokenResponseGeneratorTests_RefreshToken.cs @@ -488,7 +488,7 @@ public async Task ProcessAsync_WhenClientUpdateClaimsOnRefreshIsFalse_ShouldStil }; var fakeTokenString = "some.token.string"; - Token? updatedToken = null; + Token updatedToken = null; Mock.Get(tokenService) .Setup(x => x.CreateSecurityTokenAsync(It.IsAny())) .ReturnsAsync((Token token) => diff --git a/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/Stores/Default/DefaultPersistedGrantStoreTests.cs b/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/Stores/Default/DefaultPersistedGrantStoreTests.cs index c5c72f7f8..9b461c304 100644 --- a/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/Stores/Default/DefaultPersistedGrantStoreTests.cs +++ b/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/Stores/Default/DefaultPersistedGrantStoreTests.cs @@ -17,21 +17,22 @@ using Open.IdentityServer.Stores; using Open.IdentityServer.Stores.Serialization; using Xunit; +#pragma warning disable CS0618 // Type or member is obsolete namespace IdentityServer.UnitTests.Stores.Default; public class DefaultPersistedGrantStoreTests { - private InMemoryPersistedGrantStore _store = new InMemoryPersistedGrantStore(); - private IAuthorizationCodeStore _codes; - private IRefreshTokenStore _refreshTokens; - private IReferenceTokenStore _referenceTokens; - private IUserConsentStore _userConsent; - private StubHandleGenerationService _stubHandleGenerationService = new StubHandleGenerationService(); - - private ClaimsPrincipal _user = new IdentityServerUser("123").CreatePrincipal(); + private readonly InMemoryPersistedGrantStore _store = new InMemoryPersistedGrantStore(); + private readonly IAuthorizationCodeStore _codes; + private readonly IRefreshTokenStore _refreshTokens; + private readonly IReferenceTokenStore _referenceTokens; + private readonly IUserConsentStore _userConsent; + private readonly StubHandleGenerationService _stubHandleGenerationService = new StubHandleGenerationService(); + + private readonly ClaimsPrincipal _user = new IdentityServerUser("123").CreatePrincipal(); - private ILogger refreshTokenStoreLogger = Mock.Of>(); + private readonly ILogger refreshTokenStoreLogger = Mock.Of>(); public DefaultPersistedGrantStoreTests() { @@ -56,7 +57,7 @@ public DefaultPersistedGrantStoreTests() [Fact] public async Task StoreAuthorizationCodeAsync_ShouldGenerateHexEncodedHandle() { - var code1 = new AuthorizationCode() + var code1 = new AuthorizationCode { ClientId = "test", CreationTime = DateTime.UtcNow, @@ -76,7 +77,7 @@ public async Task StoreAuthorizationCodeAsync_ShouldGenerateHexEncodedHandle() [Fact] public async Task StoreAuthorizationCodeAsync_should_persist_grant() { - var code1 = new AuthorizationCode() + var code1 = new AuthorizationCode { ClientId = "test", CreationTime = DateTime.UtcNow, @@ -104,7 +105,7 @@ public async Task StoreAuthorizationCodeAsync_should_persist_grant() [Fact] public async Task RemoveAuthorizationCodeAsync_should_remove_grant() { - var code1 = new AuthorizationCode() + var code1 = new AuthorizationCode { ClientId = "test", CreationTime = DateTime.UtcNow, @@ -130,7 +131,7 @@ public async Task RemoveAuthorizationCodeAsync_should_remove_grant() [InlineData(7)] public async Task GetRefreshTokenAsync_when_unsupported_token_stored_should_return_null_and_log_error(int unsupportedVersion) { - var token1 = new RefreshToken() + var token1 = new RefreshToken { CreationTime = DateTime.UtcNow, Lifetime = 10, @@ -143,13 +144,13 @@ public async Task GetRefreshTokenAsync_when_unsupported_token_stored_should_retu token2.Should().BeNull(); Mock.Get(refreshTokenStoreLogger) - .Verify(x => x.Log(LogLevel.Error, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())); + .Verify(x => x.Log(LogLevel.Error, It.IsAny(), It.IsAny(), It.IsAny(), It.IsAny>())); } [Fact] public async Task GetRefreshTokenAsync_when_v4_token_stored_should_retrieve_mapped_grant() { - var token1 = new RefreshToken() + var token1 = new RefreshToken { CreationTime = DateTime.UtcNow, Lifetime = 10, @@ -191,7 +192,7 @@ public async Task GetRefreshTokenAsync_when_v4_token_stored_should_retrieve_mapp [Fact] public async Task StoreRefreshTokenAsync_ShouldGenerateHexEncodedHandle() { - var token1 = new RefreshToken() + var token1 = new RefreshToken { CreationTime = DateTime.UtcNow, Lifetime = 10, @@ -224,7 +225,7 @@ public async Task StoreRefreshTokenAsync_ShouldGenerateHexEncodedHandle() [Fact] public async Task StoreRefreshTokenAsync_should_persist_grant() { - var token1 = new RefreshToken() + var token1 = new RefreshToken { CreationTime = DateTime.UtcNow, Lifetime = 10, @@ -265,7 +266,7 @@ public async Task StoreRefreshTokenAsync_should_persist_grant() [Fact] public async Task RemoveRefreshTokenAsync_should_remove_grant() { - var token1 = new RefreshToken() + var token1 = new RefreshToken { CreationTime = DateTime.UtcNow, Lifetime = 10, @@ -287,7 +288,7 @@ public async Task RemoveRefreshTokenAsync_should_remove_grant() [Fact] public async Task RemoveRefreshTokenAsync_by_sub_and_client_should_remove_grant() { - var token1 = new RefreshToken() + var token1 = new RefreshToken { CreationTime = DateTime.UtcNow, Lifetime = 10, @@ -312,7 +313,7 @@ public async Task RemoveRefreshTokenAsync_by_sub_and_client_should_remove_grant( [Fact] public async Task StoreReferenceTokenAsync_ShouldGenerateHexEncodedHandle() { - var token1 = new Token() + var token1 = new Token { ClientId = "client", Audiences = { "aud" }, @@ -335,7 +336,7 @@ public async Task StoreReferenceTokenAsync_ShouldGenerateHexEncodedHandle() [Fact] public async Task StoreReferenceTokenAsync_should_persist_grant() { - var token1 = new Token() + var token1 = new Token { ClientId = "client", Audiences = { "aud" }, @@ -365,7 +366,7 @@ public async Task StoreReferenceTokenAsync_should_persist_grant() [Fact] public async Task RemoveReferenceTokenAsync_should_remove_grant() { - var token1 = new Token() + var token1 = new Token { ClientId = "client", Audiences = { "aud" }, @@ -388,7 +389,7 @@ public async Task RemoveReferenceTokenAsync_should_remove_grant() [Fact] public async Task RemoveReferenceTokenAsync_by_sub_and_client_should_remove_grant() { - var token1 = new Token() + var token1 = new Token { ClientId = "client", Audiences = { "aud" }, @@ -415,7 +416,7 @@ public async Task RemoveReferenceTokenAsync_by_sub_and_client_should_remove_gran [Fact] public async Task StoreUserConsentAsync_should_persist_grant() { - var consent1 = new Consent() + var consent1 = new Consent { CreationTime = DateTime.UtcNow, ClientId = "client", @@ -453,7 +454,7 @@ public async Task same_key_for_different_grant_types_should_not_interfere_with_e { _stubHandleGenerationService.Handle = "key"; - await _referenceTokens.StoreReferenceTokenAsync(new Token() + await _referenceTokens.StoreReferenceTokenAsync(new Token { ClientId = "client1", Audiences = { "aud" }, @@ -468,7 +469,7 @@ await _referenceTokens.StoreReferenceTokenAsync(new Token() } }); - await _refreshTokens.StoreRefreshTokenAsync(new RefreshToken() + await _refreshTokens.StoreRefreshTokenAsync(new RefreshToken { CreationTime = DateTime.UtcNow, Lifetime = 20, @@ -478,7 +479,7 @@ await _refreshTokens.StoreRefreshTokenAsync(new RefreshToken() AuthorizedScopes = ["baz1", "baz2"], }); - await _codes.StoreAuthorizationCodeAsync(new AuthorizationCode() + await _codes.StoreAuthorizationCodeAsync(new AuthorizationCode { ClientId = "client1", CreationTime = DateTime.UtcNow, diff --git a/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/Validation/TokenRequest Validation/TokenRequestValidation_RefreshToken_Invalid.cs b/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/Validation/TokenRequest Validation/TokenRequestValidation_RefreshToken_Invalid.cs index 4c5ed54cb..18bd4e9d1 100644 --- a/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/Validation/TokenRequest Validation/TokenRequestValidation_RefreshToken_Invalid.cs +++ b/src/Open.IdentityServer/test/Open.IdentityServer.UnitTests/Validation/TokenRequest Validation/TokenRequestValidation_RefreshToken_Invalid.cs @@ -15,6 +15,7 @@ using Open.IdentityServer.Models; using Open.IdentityServer.Stores; using Xunit; +#pragma warning disable CS0618 // Type or member is obsolete namespace IdentityServer.UnitTests.Validation.TokenRequest_Validation; diff --git a/src/Storage/src/Models/Client.cs b/src/Storage/src/Models/Client.cs index f06d281d6..a9fe06d1f 100644 --- a/src/Storage/src/Models/Client.cs +++ b/src/Storage/src/Models/Client.cs @@ -451,7 +451,7 @@ IEnumerator IEnumerable.GetEnumerator() /// /// Gets or sets initiate login URI (Unused, added for compatibility) /// - public string? InitiateLoginUri { get; set; } + public string InitiateLoginUri { get; set; } /// /// Gets or sets DPoP clock skew (Unused, added for compatibility) diff --git a/src/Storage/src/Stores/Serialization/PersistentGrantSerializer.cs b/src/Storage/src/Stores/Serialization/PersistentGrantSerializer.cs index 6ea427a71..70d9ee95c 100644 --- a/src/Storage/src/Stores/Serialization/PersistentGrantSerializer.cs +++ b/src/Storage/src/Stores/Serialization/PersistentGrantSerializer.cs @@ -4,6 +4,7 @@ #nullable enable +using System; using System.Text.Json; using Open.IdentityServer.Models; @@ -55,6 +56,12 @@ private static T HandleV4RefreshTokens(RefreshToken refreshToken) throw new UnsupportedRefreshTokenException(refreshToken.Version); } +#pragma warning disable CS0618 // Type or member is obsolete + if (refreshToken.AccessToken == null) + { + throw new RefreshTokenNullAccessTokenException(); + } + var user = new IdentityServerUser(refreshToken.AccessToken.SubjectId); if (refreshToken.AccessToken.Claims != null) { @@ -73,6 +80,7 @@ private static T HandleV4RefreshTokens(RefreshToken refreshToken) refreshToken.Version = 5; refreshToken.AccessToken = null; +#pragma warning restore CS0618 // Type or member is obsolete return (T)(object)refreshToken; } diff --git a/src/Storage/src/Stores/Serialization/RefreshTokenNullAccessTokenException.cs b/src/Storage/src/Stores/Serialization/RefreshTokenNullAccessTokenException.cs new file mode 100644 index 000000000..1fcd703a9 --- /dev/null +++ b/src/Storage/src/Stores/Serialization/RefreshTokenNullAccessTokenException.cs @@ -0,0 +1,10 @@ +using System; + +namespace Open.IdentityServer.Stores.Serialization; + +/// +/// Exception thrown when a refresh token's access token value is null when unexpected. This usually means its a version +/// 4 refresh token +/// +public class RefreshTokenNullAccessTokenException(): + Exception($"Refresh token's access token value is unexpectedly null"); \ No newline at end of file diff --git a/src/Storage/src/Utility/ClaimComparer.cs b/src/Storage/src/Utility/ClaimComparer.cs index 1c0c79e5d..417def1bf 100644 --- a/src/Storage/src/Utility/ClaimComparer.cs +++ b/src/Storage/src/Utility/ClaimComparer.cs @@ -5,12 +5,14 @@ using System.Collections.Generic; using System.Security.Claims; +#nullable enable + namespace Open.IdentityServer; /// /// Compares two instances of Claim /// -public class ClaimComparer : EqualityComparer +public class ClaimComparer: EqualityComparer { /// /// Claim comparison options @@ -49,18 +51,15 @@ public ClaimComparer(Options options) public override bool Equals(Claim? x, Claim? y) { if (x == null && y == null) return true; - if (x == null && y != null) return false; - if (x != null && y == null) return false; - - if (x == null) throw new ArgumentNullException(nameof(x)); - if (y == null) throw new ArgumentNullException(nameof(y)); + if (x == null) return false; + if (y == null) return false; var valueComparison = StringComparison.Ordinal; - if (_options.IgnoreValueCase == true) valueComparison = StringComparison.OrdinalIgnoreCase; + if (_options.IgnoreValueCase) valueComparison = StringComparison.OrdinalIgnoreCase; - var equal = (String.Equals(x.Type, y.Type, StringComparison.OrdinalIgnoreCase) && - String.Equals(x.Value, y.Value, valueComparison) && - String.Equals(x.ValueType, y.ValueType, StringComparison.Ordinal)); + var equal = string.Equals(x.Type, y.Type, StringComparison.OrdinalIgnoreCase) && + string.Equals(x.Value, y.Value, valueComparison) && + string.Equals(x.ValueType, y.ValueType, StringComparison.Ordinal); if (_options.IgnoreIssuer) { @@ -68,12 +67,12 @@ public override bool Equals(Claim? x, Claim? y) } else { - return (equal && String.Equals(x.Issuer, y.Issuer, valueComparison)); + return equal && string.Equals(x.Issuer, y.Issuer, valueComparison); } } /// - public override int GetHashCode(Claim claim) + public override int GetHashCode(Claim? claim) { if (claim is null) return 0; diff --git a/src/Storage/tests/Open.IdentityServer.Storage.UnitTests/Stores/Serialization/PersistentGrantSerializerTests.cs b/src/Storage/tests/Open.IdentityServer.Storage.UnitTests/Stores/Serialization/PersistentGrantSerializerTests.cs index 000b47592..92aac1854 100644 --- a/src/Storage/tests/Open.IdentityServer.Storage.UnitTests/Stores/Serialization/PersistentGrantSerializerTests.cs +++ b/src/Storage/tests/Open.IdentityServer.Storage.UnitTests/Stores/Serialization/PersistentGrantSerializerTests.cs @@ -93,7 +93,9 @@ public void Deserialize_WhenRefreshTokenV4WithEmptyClaims_ShouldMigrateSuccessfu result.Subject!.FindFirst("name")!.Value.Should().Be("Test User"); result.Subject!.FindFirst("email")!.Value.Should().Be("test@example.com"); +#pragma warning disable CS0618 // Type or member is obsolete result.AccessToken.Should().BeNull(); +#pragma warning restore CS0618 // Type or member is obsolete result.AccessTokens[string.Empty].Claims .Should().Contain(c => c.Type == "sid" && c.Value == "session1"); @@ -118,7 +120,9 @@ public void Deserialize_WhenRefreshTokenV5WithAccessTokens_ShouldNotMigrate() var result = sut.Deserialize(json); result!.Version.Should().Be(5); +#pragma warning disable CS0618 // Type or member is obsolete result.AccessToken.Should().BeNull(); +#pragma warning restore CS0618 // Type or member is obsolete } private static string CreateV4RefreshTokenJson() => """ @@ -141,6 +145,6 @@ private static string CreateV4RefreshTokenJson() => """ private class TestDto { - public string? Name { get; set; } + public string Name { get; set; } } } \ No newline at end of file