AspNetIdentity icon indicating copy to clipboard operation
AspNetIdentity copied to clipboard

ConcurencyFailure at SetAuthenticationTokenAsync

Open IgorMenshikov opened this issue 5 months ago • 0 comments

My NETCore 8 app. It works with Posgress database and has the code:

        var userManager = instance of UserManager<IdentityUser>
        var user = await userManager.FindByEmailAsync(parameters.Email);

        var resetCode = await userManager.GeneratePasswordResetTokenAsync(user);
        var result = userManager.SetAuthenticationTokenAsync(user, "demo", "demo", resetCode);

SetAuthenticationTokenAsync returns ConcurencyFailure in some random situations.

I have checked application logs. In normal situations it is like:

Executed DbCommand (8ms) [Parameters=[@p1='?', @p2='?', @p3='?', @p0='?', @p18='?', @p4='?' (DbType = Int32), @p5='?', @p19='?', @p6='?', @p7='?' (DbType = Boolean), @p8='?' (DbType = Boolean), @p9='?' (DbType = DateTimeOffset), @p10='?', @p11='?', @p12='?', @p13='?', @p14='?' (DbType = Boolean), @p15='?', @p16='?' (DbType = Boolean), @p17='?'], CommandType='Text', CommandTimeout='30']
2024-09-10T18:18:58.8912872Z       UPDATE "AspNetUserTokens" SET "Value" = @p0
2024-09-10T18:18:58.8912915Z       WHERE "LoginProvider" = @p1 AND "Name" = @p2 AND "UserId" = @p3;
2024-09-10T18:18:58.8912973Z       UPDATE "AspNetUsers" SET "AccessFailedCount" = @p4, "ConcurrencyStamp" = @p5, "Email" = @p6, "EmailConfirmed" = @p7, "LockoutEnabled" = @p8, "LockoutEnd" = @p9, "NormalizedEmail" = @p10, "NormalizedUserName" = @p11, "PasswordHash" = @p12, "PhoneNumber" = @p13, "PhoneNumberConfirmed" = @p14, "SecurityStamp" = @p15, "TwoFactorEnabled" = @p16, "UserName" = @p17
2024-09-10T18:18:58.8913009Z       WHERE "Id" = @p18 AND "ConcurrencyStamp" = @p19;

If the calls fails, I see two AspNetUsers updates for some reason:

2024-09-10T18:05:47.3729525Z info: Microsoft.EntityFrameworkCore.Database.Command[20101]
2024-09-10T18:05:47.3733480Z       Executed DbCommand (9ms) [Parameters=[@p1='?', @p2='?', @p3='?', @p0='?', @p18='?', @p4='?' (DbType = Int32), @p5='?', @p19='?', @p6='?', @p7='?' (DbType = Boolean), @p8='?' (DbType = Boolean), @p9='?' (DbType = DateTimeOffset), @p10='?', @p11='?', @p12='?', @p13='?', @p14='?' (DbType = Boolean), @p15='?', @p16='?' (DbType = Boolean), @p17='?', @p34='?', @p20='?' (DbType = Int32), @p21='?', @p35='?', @p22='?', @p23='?' (DbType = Boolean), @p24='?' (DbType = Boolean), @p25='?' (DbType = DateTimeOffset), @p26='?', @p27='?', @p28='?', @p29='?', @p30='?' (DbType = Boolean), @p31='?', @p32='?' (DbType = Boolean), @p33='?'], CommandType='Text', CommandTimeout='30']
2024-09-10T18:05:47.3733562Z       UPDATE "AspNetUserTokens" SET "Value" = @p0
2024-09-10T18:05:47.3733602Z       WHERE "LoginProvider" = @p1 AND "Name" = @p2 AND "UserId" = @p3;
2024-09-10T18:05:47.3733658Z       UPDATE "AspNetUsers" SET "AccessFailedCount" = @p4, "ConcurrencyStamp" = @p5, "Email" = @p6, "EmailConfirmed" = @p7, "LockoutEnabled" = @p8, "LockoutEnd" = @p9, "NormalizedEmail" = @p10, "NormalizedUserName" = @p11, "PasswordHash" = @p12, "PhoneNumber" = @p13, "PhoneNumberConfirmed" = @p14, "SecurityStamp" = @p15, "TwoFactorEnabled" = @p16, "UserName" = @p17
2024-09-10T18:05:47.3733695Z       WHERE "Id" = @p18 AND "ConcurrencyStamp" = @p19;
2024-09-10T18:05:47.3733766Z       UPDATE "AspNetUsers" SET "AccessFailedCount" = @p20, "ConcurrencyStamp" = @p21, "Email" = @p22, "EmailConfirmed" = @p23, "LockoutEnabled" = @p24, "LockoutEnd" = @p25, "NormalizedEmail" = @p26, "NormalizedUserName" = @p27, "PasswordHash" = @p28, "PhoneNumber" = @p29, "PhoneNumberConfirmed" = @p30, "SecurityStamp" = @p31, "TwoFactorEnabled" = @p32, "UserName" = @p33
2024-09-10T18:05:47.3733803Z       WHERE "Id" = @p34 AND "ConcurrencyStamp" = @p35;

For sure the second update fails but I cannot understand library executes it.

IgorMenshikov avatar Sep 10 '24 18:09 IgorMenshikov