SignInManager ‹TUser› .PasswordSignInAsync () выдает исключение цикла объекта System.Text.Json

Несколько дней назад я решил переписать старый проект API с .net core 2.0 на 3.1, но сегодня я столкнулся с ошибкой, которую не могу решить. После перезаписи AccountManager класс _signInManager.PasswordSignInAsync () начинает выдавать ошибку, связанную с циклом объекта Json.

Исключение:

((System.Text.Json.JsonException) ex) .Message: обнаружен возможный цикл объекта, который не поддерживается. Это может происходить либо из-за цикла, либо из-за того, что глубина объекта превышает максимально допустимую глубину 32.

Пример использования:

public class AccountManager : IAccountManager{

        public ApplicationUser ActualUser { get; private set; }
        private readonly SignInManager<ApplicationUser> _signInManager;

        public AccountManager(SignInManager<ApplicationUser> signInManager)
        {
            _signInManager = signInManager;
        }

        public async Task<LoginResponseDTO> LoginAsync(LoginRequestDTO input)
        {
            var result = await _signInManager.PasswordSignInAsync(input.Email, input.Password, false, true);
            ...
        }
}

Запускать:

    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

        public void ConfigureServices(IServiceCollection services)
        {
            ...
            var builder = services.AddIdentityCore<ApplicationUser>(u =>
            {
                ...
            })
            .AddEntityFrameworkStores<RBDbContext>().AddDefaultTokenProviders()
            .AddSignInManager<UserManager<ApplicationUser>>()
            .AddUserManager<UserManager<ApplicationUser>>();
            builder.AddEntityFrameworkStores<RBDbContext>().AddDefaultTokenProviders();
            services.AddScoped<IAccountManager,AccountManager>();
            services.AddControllers();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseAuthentication();
            app.UseAuthorization();
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
            });
        }
    }
}

Я даже пытался использовать атрибут пользователя и других классов [JsonIgnore], но это не сработало. Класс пользователя приложения:

    public class ApplicationUser : IdentityUser
    {
        public string Avatar { get; set; }
        ...

        [JsonIgnore]
        public virtual ICollection<Order> Orders{ get; set; }
        [JsonIgnore]
        public virtual ICollection<Participation> Participations{ get; set; }
        [JsonIgnore]
        public virtual ICollection<UserProduct> UserProducts{ get; set; }
    }

UserManager происходит от Microsoft.Extensions.Identity.Core, Version = 3.1.2.0.


person Damian    schedule 01.03.2020    source источник


Ответы (1)


Обнаружен возможный цикл объекта, который не поддерживается. Это может происходить либо из-за цикла, либо из-за того, что глубина объекта превышает максимально допустимую глубину 32.

В ASP.NET Core 3.0+ используется System.Text.Json by по умолчанию для сериализации JSON, и некоторые функции Newtonsoft.Json могут не работать с System.Text.Json (например, Newtonsoft.Json не имеет максимальной глубины limit по умолчанию), что может вызвать эту проблему.

Вы можете попробовать установить Microsoft.AspNetCore.Mvc.NewtonsoftJson Пакет NuGet, чтобы добавить поддержку средств форматирования и функций на основе Newtonsoft.Json с помощью следующего фрагмента кода и проверить, работает ли он для вас.

services.AddControllersWithViews().AddNewtonsoftJson(options =>
{
    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
});

Кроме того, вы можете найти различия между Newtonsoft.Json и System.Text.Json отсюда: https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-migrate-from-newtonsoft-how-to#таблица-различий-между-newtonsoftjson-and-systemtextjson

person Fei Han    schedule 03.03.2020