From de00feeca1740873bc034ab03f13156b135acffd Mon Sep 17 00:00:00 2001 From: Brock Allen Date: Mon, 21 Dec 2020 14:08:58 -0500 Subject: [PATCH] use msft json serializer (away from newtonsoft) --- Directory.Build.targets | 1 + .../Duende.IdentityServer.Storage.csproj | 1 + .../Stores/Serialization/ClaimConverter.cs | 28 ++++++++----------- .../Serialization/ClaimsPrincipalConverter.cs | 24 ++++++---------- .../PersistentGrantSerializer.cs | 20 +++++++------ 5 files changed, 33 insertions(+), 41 deletions(-) diff --git a/Directory.Build.targets b/Directory.Build.targets index a7d68b99b..9ef4aa5e0 100644 --- a/Directory.Build.targets +++ b/Directory.Build.targets @@ -31,6 +31,7 @@ + diff --git a/src/Storage/Duende.IdentityServer.Storage.csproj b/src/Storage/Duende.IdentityServer.Storage.csproj index ba7632e43..90cbf5e5b 100644 --- a/src/Storage/Duende.IdentityServer.Storage.csproj +++ b/src/Storage/Duende.IdentityServer.Storage.csproj @@ -10,6 +10,7 @@ + diff --git a/src/Storage/Stores/Serialization/ClaimConverter.cs b/src/Storage/Stores/Serialization/ClaimConverter.cs index eb85da4ae..48cb2bde0 100644 --- a/src/Storage/Stores/Serialization/ClaimConverter.cs +++ b/src/Storage/Stores/Serialization/ClaimConverter.cs @@ -1,41 +1,35 @@ -// Copyright (c) Duende Software. All rights reserved. +// Copyright (c) Duende Software. All rights reserved. // See LICENSE in the project root for license information. -using Newtonsoft.Json; using System; using System.Security.Claims; +using System.Text.Json; +using System.Text.Json.Serialization; #pragma warning disable 1591 namespace Duende.IdentityServer.Stores.Serialization { - public class ClaimConverter : JsonConverter + public class ClaimConverter : JsonConverter { - public override bool CanConvert(Type objectType) + public override Claim Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - return typeof(Claim) == objectType; - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - var source = serializer.Deserialize(reader); + var source = JsonSerializer.Deserialize(ref reader, options); var target = new Claim(source.Type, source.Value, source.ValueType); return target; } - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override void Write(Utf8JsonWriter writer, Claim value, JsonSerializerOptions options) { - var source = (Claim)value; - var target = new ClaimLite { - Type = source.Type, - Value = source.Value, - ValueType = source.ValueType + Type = value.Type, + Value = value.Value, + ValueType = value.ValueType }; - serializer.Serialize(writer, target); + JsonSerializer.Serialize(writer, target, options); } } } \ No newline at end of file diff --git a/src/Storage/Stores/Serialization/ClaimsPrincipalConverter.cs b/src/Storage/Stores/Serialization/ClaimsPrincipalConverter.cs index 5c0b6f9fa..e1216c230 100644 --- a/src/Storage/Stores/Serialization/ClaimsPrincipalConverter.cs +++ b/src/Storage/Stores/Serialization/ClaimsPrincipalConverter.cs @@ -3,25 +3,21 @@ using IdentityModel; -using Newtonsoft.Json; using System; using System.Linq; using System.Security.Claims; +using System.Text.Json; +using System.Text.Json.Serialization; #pragma warning disable 1591 namespace Duende.IdentityServer.Stores.Serialization { - public class ClaimsPrincipalConverter : JsonConverter + public class ClaimsPrincipalConverter : JsonConverter { - public override bool CanConvert(Type objectType) + public override ClaimsPrincipal Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - return typeof(ClaimsPrincipal) == objectType; - } - - public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) - { - var source = serializer.Deserialize(reader); + var source = JsonSerializer.Deserialize(ref reader, options); if (source == null) return null; var claims = source.Claims.Select(x => new Claim(x.Type, x.Value, x.ValueType)); @@ -30,16 +26,14 @@ public override object ReadJson(JsonReader reader, Type objectType, object exist return target; } - public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) + public override void Write(Utf8JsonWriter writer, ClaimsPrincipal value, JsonSerializerOptions options) { - var source = (ClaimsPrincipal)value; - var target = new ClaimsPrincipalLite { - AuthenticationType = source.Identity.AuthenticationType, - Claims = source.Claims.Select(x => new ClaimLite { Type = x.Type, Value = x.Value, ValueType = x.ValueType }).ToArray() + AuthenticationType = value.Identity.AuthenticationType, + Claims = value.Claims.Select(x => new ClaimLite { Type = x.Type, Value = x.Value, ValueType = x.ValueType }).ToArray() }; - serializer.Serialize(writer, target); + JsonSerializer.Serialize(writer, target, options); } } } diff --git a/src/Storage/Stores/Serialization/PersistentGrantSerializer.cs b/src/Storage/Stores/Serialization/PersistentGrantSerializer.cs index b70c5e36b..ddc368d55 100644 --- a/src/Storage/Stores/Serialization/PersistentGrantSerializer.cs +++ b/src/Storage/Stores/Serialization/PersistentGrantSerializer.cs @@ -3,8 +3,8 @@ using Microsoft.AspNetCore.DataProtection; -using Newtonsoft.Json; using System; +using System.Text.Json; namespace Duende.IdentityServer.Stores.Serialization { @@ -25,16 +25,18 @@ public class PersistentGrantOptions /// public class PersistentGrantSerializer : IPersistentGrantSerializer { - private static readonly JsonSerializerSettings _settings; + private static readonly JsonSerializerOptions _settings; private readonly PersistentGrantOptions _options; private readonly IDataProtector _provider; static PersistentGrantSerializer() { - _settings = new JsonSerializerSettings + _settings = new JsonSerializerOptions { - ContractResolver = new CustomContractResolver() + IgnoreReadOnlyFields = true, + IgnoreReadOnlyProperties = true, + }; _settings.Converters.Add(new ClaimConverter()); _settings.Converters.Add(new ClaimsPrincipalConverter()); @@ -61,7 +63,7 @@ public PersistentGrantSerializer(PersistentGrantOptions options = null, IDataPro /// public string Serialize(T value) { - var payload = JsonConvert.SerializeObject(value, _settings); + var payload = JsonSerializer.Serialize(value, _settings); if (ShouldDataProtect) { @@ -75,7 +77,7 @@ public string Serialize(T value) Payload = payload, }; - return JsonConvert.SerializeObject(data, _settings); + return JsonSerializer.Serialize(data, _settings); } /// @@ -86,11 +88,11 @@ public string Serialize(T value) /// public T Deserialize(string json) { - var container = JsonConvert.DeserializeObject(json, _settings); + var container = JsonSerializer.Deserialize(json, _settings); if (container.PersistentGrantDataContainerVersion == 0) { - return JsonConvert.DeserializeObject(json, _settings); + return JsonSerializer.Deserialize(json, _settings); } if (container.PersistentGrantDataContainerVersion == 1) @@ -107,7 +109,7 @@ public T Deserialize(string json) payload = _provider.Unprotect(container.Payload); } - return JsonConvert.DeserializeObject(payload, _settings); + return JsonSerializer.Deserialize(payload, _settings); } throw new Exception($"Invalid version in persisted grant data: '{container.PersistentGrantDataContainerVersion}'.");