diff --git a/sdk/resourcemanager/Azure.ResourceManager/CHANGELOG.md b/sdk/resourcemanager/Azure.ResourceManager/CHANGELOG.md index 561d8d68a3e6..4ecccb9cffd6 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/CHANGELOG.md +++ b/sdk/resourcemanager/Azure.ResourceManager/CHANGELOG.md @@ -8,6 +8,8 @@ ### Bugs Fixed +- Fixed `ManagedServiceIdentity` deserialization when services return empty string for `principalId` or `tenantId`. + ### Other Changes ## 1.4.0 (2023-02-10) diff --git a/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/ManagedServiceIdentity.Serialization.cs b/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/ManagedServiceIdentity.Serialization.cs index 76232548605a..cb5895995f7b 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/ManagedServiceIdentity.Serialization.cs +++ b/sdk/resourcemanager/Azure.ResourceManager/src/Common/Custom/Models/ManagedServiceIdentity.Serialization.cs @@ -21,7 +21,7 @@ internal static void Write(Utf8JsonWriter writer, ManagedServiceIdentity model, JsonSerializer.Serialize(writer, model.ManagedServiceIdentityType, options); if (Optional.IsCollectionDefined(model.UserAssignedIdentities)) { - writer.WritePropertyName("userAssignedIdentities"); + writer.WritePropertyName("userAssignedIdentities"u8); writer.WriteStartObject(); foreach (var item in model.UserAssignedIdentities) { @@ -48,9 +48,9 @@ internal static ManagedServiceIdentity DeserializeManagedServiceIdentity(JsonEle Optional> userAssignedIdentities = default; foreach (var property in element.EnumerateObject()) { - if (property.NameEquals("principalId")) + if (property.NameEquals("principalId"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) + if (property.Value.ValueKind == JsonValueKind.Null || property.Value.GetString().Length == 0) { property.ThrowNonNullablePropertyIsNull(); continue; @@ -58,9 +58,9 @@ internal static ManagedServiceIdentity DeserializeManagedServiceIdentity(JsonEle principalId = property.Value.GetGuid(); continue; } - if (property.NameEquals("tenantId")) + if (property.NameEquals("tenantId"u8)) { - if (property.Value.ValueKind == JsonValueKind.Null) + if (property.Value.ValueKind == JsonValueKind.Null || property.Value.GetString().Length == 0) { property.ThrowNonNullablePropertyIsNull(); continue; @@ -68,12 +68,12 @@ internal static ManagedServiceIdentity DeserializeManagedServiceIdentity(JsonEle tenantId = property.Value.GetGuid(); continue; } - if (property.NameEquals("type")) + if (property.NameEquals("type"u8)) { type = JsonSerializer.Deserialize("{"+property.ToString()+"}", options); continue; } - if (property.NameEquals("userAssignedIdentities")) + if (property.NameEquals("userAssignedIdentities"u8)) { if (property.Value.ValueKind == JsonValueKind.Null) { diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/ManagedServiceIdentityTest.cs b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/ManagedServiceIdentityTest.cs index ddef930fb319..a3540759d876 100644 --- a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/ManagedServiceIdentityTest.cs +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/ManagedServiceIdentityTest.cs @@ -48,6 +48,18 @@ public void TestDeserializerInvalidType() Assert.AreEqual("77563a98-c9d9-4f7b-a7af-592d21fa2153", user.Values.First().PrincipalId.ToString()); } + [TestCase] + public void TestDeserializerNoneWithEmptyStringIds() + { + var identityJsonProperty = DeserializerHelper("NoneEmptyStringIds.json"); +#if DEBUG + Assert.Throws(delegate { ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); }); +#else + ManagedServiceIdentity back = ManagedServiceIdentity.DeserializeManagedServiceIdentity(identityJsonProperty.Value); + Assert.AreEqual(ManagedServiceIdentityType.None, back.ManagedServiceIdentityType); +#endif + } + [TestCase] public void TestDeserializerValidInnerExtraField() { diff --git a/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/NoneEmptyStringIds.json b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/NoneEmptyStringIds.json new file mode 100644 index 000000000000..5064def489d3 --- /dev/null +++ b/sdk/resourcemanager/Azure.ResourceManager/tests/Unit/TestAssets/Identity/NoneEmptyStringIds.json @@ -0,0 +1,8 @@ +{ + "identity": { + "principalId": "", + "tenantId": "", + "type": "None" + } + } + \ No newline at end of file