From 68bd5d5e34f7bdf8d26ee404093a84e8cf0e3a37 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A9vin=20Chalet?= Date: Wed, 20 Apr 2022 18:06:42 +0200 Subject: [PATCH] Support additional integer claim value types --- .../OpenIddictClientHandlers.Userinfo.cs | 18 ++++++++++++------ ...enIddictValidationHandlers.Introspection.cs | 18 ++++++++++++------ 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/OpenIddict.Client/OpenIddictClientHandlers.Userinfo.cs b/src/OpenIddict.Client/OpenIddictClientHandlers.Userinfo.cs index 102c124f..b2ac0a7f 100644 --- a/src/OpenIddict.Client/OpenIddictClientHandlers.Userinfo.cs +++ b/src/OpenIddict.Client/OpenIddictClientHandlers.Userinfo.cs @@ -173,7 +173,7 @@ public static partial class OpenIddictClientHandlers identity.AddClaim(new Claim( type : parameter.Key, value : item.ToString()!, - valueType : GetClaimValueType(item.ValueKind), + valueType : GetClaimValueType(item), issuer : issuer, originalIssuer: issuer, subject : identity)); @@ -186,7 +186,7 @@ public static partial class OpenIddictClientHandlers identity.AddClaim(new Claim( type : parameter.Key, value : value.ToString()!, - valueType : GetClaimValueType(value.ValueKind), + valueType : GetClaimValueType(value), issuer : issuer, originalIssuer: issuer, subject : identity)); @@ -196,11 +196,17 @@ public static partial class OpenIddictClientHandlers context.Principal = new ClaimsPrincipal(identity); - static string GetClaimValueType(JsonValueKind kind) => kind switch + static string GetClaimValueType(JsonElement element) => element.ValueKind switch { - JsonValueKind.String => ClaimValueTypes.String, - JsonValueKind.Number => ClaimValueTypes.Integer64, - JsonValueKind.True or JsonValueKind.False => ClaimValueTypes.Boolean, + JsonValueKind.String => ClaimValueTypes.String, + JsonValueKind.True or JsonValueKind.False => ClaimValueTypes.Boolean, + + JsonValueKind.Number when element.TryGetInt32(out _) => ClaimValueTypes.Integer32, + JsonValueKind.Number when element.TryGetInt64(out _) => ClaimValueTypes.Integer64, + JsonValueKind.Number when element.TryGetUInt32(out _) => ClaimValueTypes.UInteger32, + JsonValueKind.Number when element.TryGetUInt64(out _) => ClaimValueTypes.UInteger64, + JsonValueKind.Number when element.TryGetDouble(out _) => ClaimValueTypes.Double, + JsonValueKind.Null or JsonValueKind.Undefined => JsonClaimValueTypes.JsonNull, JsonValueKind.Array => JsonClaimValueTypes.JsonArray, JsonValueKind.Object or _ => JsonClaimValueTypes.Json diff --git a/src/OpenIddict.Validation/OpenIddictValidationHandlers.Introspection.cs b/src/OpenIddict.Validation/OpenIddictValidationHandlers.Introspection.cs index 92ee31f1..723c1b1c 100644 --- a/src/OpenIddict.Validation/OpenIddictValidationHandlers.Introspection.cs +++ b/src/OpenIddict.Validation/OpenIddictValidationHandlers.Introspection.cs @@ -425,7 +425,7 @@ public static partial class OpenIddictValidationHandlers identity.AddClaim(new Claim( type : parameter.Key, value : item.ToString()!, - valueType : GetClaimValueType(item.ValueKind), + valueType : GetClaimValueType(item), issuer : issuer, originalIssuer: issuer, subject : identity)); @@ -438,7 +438,7 @@ public static partial class OpenIddictValidationHandlers identity.AddClaim(new Claim( type : parameter.Key, value : value.ToString()!, - valueType : GetClaimValueType(value.ValueKind), + valueType : GetClaimValueType(value), issuer : issuer, originalIssuer: issuer, subject : identity)); @@ -448,11 +448,17 @@ public static partial class OpenIddictValidationHandlers context.Principal = new ClaimsPrincipal(identity); - static string GetClaimValueType(JsonValueKind kind) => kind switch + static string GetClaimValueType(JsonElement element) => element.ValueKind switch { - JsonValueKind.String => ClaimValueTypes.String, - JsonValueKind.Number => ClaimValueTypes.Integer64, - JsonValueKind.True or JsonValueKind.False => ClaimValueTypes.Boolean, + JsonValueKind.String => ClaimValueTypes.String, + JsonValueKind.True or JsonValueKind.False => ClaimValueTypes.Boolean, + + JsonValueKind.Number when element.TryGetInt32(out _) => ClaimValueTypes.Integer32, + JsonValueKind.Number when element.TryGetInt64(out _) => ClaimValueTypes.Integer64, + JsonValueKind.Number when element.TryGetUInt32(out _) => ClaimValueTypes.UInteger32, + JsonValueKind.Number when element.TryGetUInt64(out _) => ClaimValueTypes.UInteger64, + JsonValueKind.Number when element.TryGetDouble(out _) => ClaimValueTypes.Double, + JsonValueKind.Null or JsonValueKind.Undefined => JsonClaimValueTypes.JsonNull, JsonValueKind.Array => JsonClaimValueTypes.JsonArray, JsonValueKind.Object or _ => JsonClaimValueTypes.Json