Аудит.Параметры размещения чистых настраиваемых полей различаются между созданием области вручную и созданием области на основе действий

#c# #.net-core #asp.net-core-webapi #audit.net

Вопрос:

При использовании аудита.Сеть в WebAPI область создается для каждого события действия контроллера, и когда мы добавляем пользовательские поля, они отображаются на корневом уровне в json. Но когда мы создаем область аудита вручную, и если вы добавляете какие-либо пользовательские поля в область аудита, они вложены в тег «пользовательские поля». Не уверен, почему такое поведение отличается как для создания типа области, так и для создания.

Смотрите пример ниже: Это генерируется auditscope, созданным при вызове действия на контроллере: AuditInfo добавляется через auditScope.SetCustomField("AuditInfo",auditInfo);

 {
    "EventType": "TestEvent",
    "Environment": {
        "DomainName": "IIS APPPOOL",
    },
    "Action": {
        "ActionParameters": {
            }
        },
        "RequestBody": {
            "Type": "application/json",
            "Length": 3191
        },
        "Headers": {
        },
        "ResponseHeaders": {
        }
    },
    "AuditInfo": {
        "UserIdentifier": "",
        "ClaimType": "iss",
        "AuditType": 0
    },
    "id": "",
    "_ts": 1627916814
}
 

Ниже json создается, когда я создал AuditScope вручную, используя AuditScope.CreateAsync метод:

   "EventType": "TestEvent",
  "CustomFields": {
        "AuditInfo": {
            "UserIdentifier": "",
            "ClaimType": "",
            "AuditType": 0
        }
    }
 

если вы заметили, AuditInfo помещается под тегом «Пользовательские поля». Может ли кто-нибудь объяснить мне, почему он помещается в «Пользовательские поля», когда область аудита создается вручную?

Комментарии:

1. Как вы сериализуете файл AuditEvent в JSON? Вы пользуетесь auditEvent.ToJson() этим ? Также укажите, какова ваша целевая версия .net framework. Я предполагаю, что есть проблема при смешивании Newtonsoft.Json System.Text.Json и. (т. Е. При использовании системы [JsonExtensionData] from. Текст, но сериализация с помощью Newtonsoft)

2. @thepirat000 Используя сериализацию по умолчанию, я использую метод auditscope.save и ничего больше. .net 5. Обновлен audit.net библиотеки для использования версии 18. Использование azure cosmos db и использование поставщика cosmos для сохранения события в cosmos.

3. о, я знаю, в чем проблема, текущая версия Audit.NET.AzureCosmos не на 100% совместима с .net 5.0, это потому, что используется библиотека AzureCosmos (Microsoft. Лазурь. DocumentDB.Core) работает только с Newtonsoft. Json, но Аудит. Целевая сеть .net 5.0 использует System.Text.Json, поэтому необходимый атрибут JsonExtensionData отсутствует. Я думаю, что мог бы исправить это, используя более новый клиент (Microsoft. Лазурь. Космос), что позволяет настроить пользовательский сериализатор. Не могли бы вы открыть здесь вопрос?

4. @открыт выпуск thepirat000 github.com/thepirat000/Audit.NET/issues/434

Ответ №1:

Это было исправлено в последней Audit.NET.AzureCosmos версии.

Проблема: https://github.com/thepirat000/Audit.NET/issues/434

Проблема заключалась в том Audit.NET.AzureCosmos , что ранее использовалась библиотека Microsoft.Azure.DocumentDB.Core , которая была связана с Newtonsoft.Json .NET 5.0, но Audit.NET предназначалась для использования System.Text.Json , поэтому JsonExtensionData требуемые атрибуты и другие атрибуты AuditEvent не были приняты во внимание.

Теперь при ориентации на .NET Standard 2.0 или .NET 5.0 используется новая клиентская библиотека Microsoft.Azure.Cosmos и устанавливается пользовательский сериализатор, поэтому сериализация обрабатывается механизмом сериализации по умолчанию из Audit.Core.Configuration.JsonAdapter

Комментарии:

1. Я думаю, что новые изменения нарушаются при попытке использовать адаптер Newtonsoft с Net 5 с приведенным ниже кодом в соответствии со статьей пользовательская сериализация: настройки var = новые настройки JsonSerializerSettings() { TypeNameHandling = TypeNameHandling. Все }; Аудит.Ядро.Конфигурация. JsonAdapter = новый JsonNewtonsoftAdapter(настройки); ниже выводится ошибка: Исключение DocumentClientException с кодом состояния BadRequest, сообщение: Сообщение: {«Ошибки»:[«Входное содержимое недопустимо, поскольку отсутствуют требуемые свойства — ‘идентификатор;’. Пытаюсь найти более подробную информацию, чтобы поделиться с вами.

2. Я думаю, что проблема в том же , так как в .NET 5.0 значение AuditEvent.CustomFields украшено System.Text.Json.JsonExtensionData вместо Newtonsoft.Json.JsonExtensionData , поэтому, когда AuditEvent используется сериализация Newtonsoft.Json , CustomFields свойство будет сериализовано как обычное поле. Я не уверен, что это можно решить, кроме как сделав Audit.NET зависимым от обоих System.Text.Json , и Newtonsoft.Json это кажется не идеальным

3. На самом деле я говорю о другой проблеме, которая выскакивает, когда я пытаюсь установить JsonNewtonsoftAdapter как сериализацию по умолчанию обработчик для проверки, затем полноценный аудит библиотека дает сбой с ошибкой DocumentClientException с кодом состояния BadRequest, сообщение: сообщение: {«ошибки»:[«ввод контента, является недействительным, поскольку требуемые свойства — ИД;’ — отсутствуют это происходит, как только мы начинаем применение и при ревизии пытается записать данные в космос

4. Да, но проблема та же самая. В этом случае cosmos требует id свойства в JSON, но это AuditEvent свойство не определено, поэтому оно задано как пользовательское поле с ключом «id», но словарь пользовательских полей требует, чтобы JsonExtensionData атрибут был сериализован как свойства. Я проверю, могу ли я предоставить обходной путь для поставщика azure cosmos, чтобы идентификатор был установлен таким образом, чтобы он не зависел от правильной сериализации пользовательских полей. Но несовместимость с пользовательскими полями все равно будет присутствовать при смешивании System.Text. Json и Newtonsoft.Json.