public Task UpdateAsync(TUser user) { if (user == null) { throw new ArgumentNullException("null parameter for update_async operation"); } var updatedUser = new BOIdentityUser(); updatedUser.Repository = IdentityUserRepository; updatedUser.IdentityUserClaimRepository = IdentityUserClaimRepository; updatedUser.IdentityUserLoginRepository = IdentityUserLoginRepository; updatedUser.IdentityUserRoleRepository = IdentityUserRoleRepository; updatedUser.Init(user.Id); updatedUser.Username = user.UserName; updatedUser.PasswordHash = user.PasswordHash; updatedUser.SecurityStamp = user.SecurityStamp; updatedUser.Email = user.Email; updatedUser.PhoneNumber = user.PhoneNumber; updatedUser.EmailConfirmed = user.IsEmailConfirmed; updatedUser.PhoneNumberConfirmed = user.IsPhoneNumberConfirmed; updatedUser.AccessFailedCount = user.AccessFailedCount; updatedUser.LockoutEnabled = user.LockoutEnabled; updatedUser.LockoutEndDateUtc = (user.LockoutEndDate.UtcDateTime != DateTime.MinValue ? user.LockoutEndDate.UtcDateTime : updatedUser.LockoutEndDateUtc); updatedUser.TwoFactorEnabled = user.TwoFactorAuthEnabled; updatedUser.Update(); updatedUser.DeleteAllIdentityUserClaim(); updatedUser.DeleteAllIdentityUserLogin(); updatedUser.DeleteAllIdentityUserRole(); foreach (var role in user.Roles) { BOIdentityRole identityRole = new Criteria <BOIdentityRole>(IdentityRoleRepository).Add(Expression.Eq("Name", role)) .SingleOrDefault <BOIdentityRole>(); if (identityRole != null) { updatedUser.AddIdentityUserRole(new BOIdentityUserRole() { Repository = IdentityUserRoleRepository, RoleId = identityRole.Id }); } } foreach (var claim in user.Claims) { updatedUser.AddIdentityUserClaim(new BOIdentityUserClaim() { Repository = IdentityUserClaimRepository, ClaimType = claim.ClaimType, ClaimValue = claim.ClaimValue }); } foreach (var login in user.Logins) { updatedUser.AddIdentityUserLogin(new BOIdentityUserLogin() { Repository = IdentityUserLoginRepository, LoginProvider = login.LoginProvider, ProviderKey = login.ProviderKey }); } /*remove possible stale object, an updated one will get picked up in findbyidasync method when required*/ var cachedObject = _identityUsersCache.SingleOrDefault(x => x.UserId == updatedUser.UserId); if (cachedObject != null) { _identityUsersCache.Remove(cachedObject); } _identityUsersCache.Add(updatedUser); return(Task.FromResult(true)); }