Microsoft Identity Framework assigning roles to user error with Postgres Database - The CancellationTokenSource has been disposed

Viewed 169

Hi I am having issues with assigning roles to users with Identity Framework 5.0.5, .net5.0.5 and a Postgres SQL db.

The code used to assign the roles to users can be seen below with the error below it.

Please help if possible.

Thanks so much!

       {
           if (!await roleManager.RoleExistsAsync("Admin"))
           {
               await roleManager.CreateAsync(new IdentityRole
               {
                   Name = "Admin"
               });
           }
           
           ApplicationUser user = await userManager.FindByIdAsync(userId);
           if (isAdmin)
           {
               await userManager.AddToRoleAsync(user, "Admin");
           }
           else
           {
               await userManager.RemoveFromRoleAsync(user, "Admin");
           }
       }
   }


services.AddDbContext<ApplicationDbContext>(options =>
   options.UseNpgsql(
       Configuration.GetConnectionString("DefaultConnection"), 
       builder => builder.EnableRetryOnFailure(50, TimeSpan.FromSeconds(5), null)));


System.ObjectDisposedException: The CancellationTokenSource has been disposed.
   at System.Threading.CancellationTokenSource.ThrowObjectDisposedException()
   at System.Threading.CancellationTokenSource.CancelAfter(Int32 millisecondsDelay)
   at System.Threading.CancellationTokenSource.CancelAfter(TimeSpan delay)
   at Npgsql.Util.ResettableCancellationTokenSource.Stop()
   at Npgsql.NpgsqlReadBuffer.<Ensure>g__EnsureLong|40_0(NpgsqlReadBuffer buffer, Int32 count, Boolean async, Boolean readingNotifications)
   at Npgsql.NpgsqlConnector.<ReadMessage>g__ReadMessageLong|194_0(NpgsqlConnector connector, Boolean async, DataRowLoadingMode dataRowLoadingMode, Boolean readingNotifications, Boolean isReadingPrependedMessage)
   at Npgsql.NpgsqlDataReader.NextResult(Boolean async, Boolean isConsuming, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteReader(CommandBehavior behavior, Boolean async, CancellationToken cancellationToken)
   at Npgsql.NpgsqlCommand.ExecuteDbDataReaderAsync(CommandBehavior behavior, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.InitializeReaderAsync(DbContext _, Boolean result, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func`4 operation, Func`4 verifySucceeded, TState state, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync[TState,TResult](Func`4 operation, Func`4 verifySucceeded, TState state, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Query.Internal.SingleQueryingEnumerable`1.AsyncEnumerator.MoveNextAsync()
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
   at Microsoft.EntityFrameworkCore.Query.ShapedQueryCompilingExpressionVisitor.SingleOrDefaultAsync[TSource](IAsyncEnumerable`1 asyncEnumerable, CancellationToken cancellationToken)
   at SearchDataScreening.Pages.UserManagement.OnGetAdminControl(String userId, Boolean isAdmin) in /Users/dewaldthattingh/GitHubRepos/TPS/SearchScreening/SearchDataScreening/Pages/UserManagement.cshtml.cs:line 50
   at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__140_1(Object state)
   at System.Threading.QueueUserWorkItemCallback.<>c.<.cctor>b__6_0(QueueUserWorkItemCallback quwi)
   at System.Threading.ExecutionContext.RunForThreadPoolUnsafe[TState](ExecutionContext executionContext, Action`1 callback, TState& state)
   at System.Threading.QueueUserWorkItemCallback.Execute()
   at System.Threading.ThreadPoolWorkQueue.Dispatch()
   at System.Threading._ThreadPoolWaitCallback.PerformWaitCallback()

1 Answers

Please try changing it to not use the await methods like below

  bool roleExist =  roleManager.RoleExistsAsync("Admin").Result;
        if (!roleExist)
        {
            var x =  roleManager.CreateAsync(new IdentityRole
            {
                Name = "Admin"
            }).Result;
        }

        if (isAdmin)
        {
            var user =  userManager.FindByIdAsync(userId).Result;
            if (user != null)
            {
                var x = userManager.AddToRoleAsync(user, "Admin").Result;
            }
        }
        else
        {
            var user =  userManager.FindByIdAsync(userId).Result;
            if (user != null)
            {
                var x = userManager.RemoveFromRoleAsync(user, "Admin").Result;
            }
        }
Related