diff --git a/Oqtane.Server/Infrastructure/DatabaseManager.cs b/Oqtane.Server/Infrastructure/DatabaseManager.cs index 3d9be5de..71126d11 100644 --- a/Oqtane.Server/Infrastructure/DatabaseManager.cs +++ b/Oqtane.Server/Infrastructure/DatabaseManager.cs @@ -375,7 +375,6 @@ namespace Oqtane.Infrastructure AddEFMigrationsHistory(sql, _configManager.GetSetting($"{SettingKeys.ConnectionStringsSection}:{tenant.DBConnectionString}", ""), tenant.DBType, tenant.Version, false); // push latest model into database tenantDbContext.Database.Migrate(); - result.Success = true; } } catch (Exception ex) @@ -384,35 +383,35 @@ namespace Oqtane.Infrastructure _filelogger.LogError(Utilities.LogMessage(this, result.Message)); } - // execute any version specific upgrade logic - var version = tenant.Version; - var index = Array.FindIndex(versions, item => item == version); - if (index != (versions.Length - 1)) + if (string.IsNullOrEmpty(result.Message)) { - try + // execute any version specific upgrade logic + var version = tenant.Version; + var index = Array.FindIndex(versions, item => item == version); + if (index != (versions.Length - 1)) { - for (var i = (index + 1); i < versions.Length; i++) + try { - upgrades.Upgrade(tenant, versions[i]); + for (var i = (index + 1); i < versions.Length; i++) + { + upgrades.Upgrade(tenant, versions[i]); + } + tenant.Version = versions[versions.Length - 1]; + db.Entry(tenant).State = EntityState.Modified; + db.SaveChanges(); + } + catch (Exception ex) + { + result.Message = "An Error Occurred Executing Upgrade Logic On Tenant " + tenant.Name + ". " + ex.ToString(); + _filelogger.LogError(Utilities.LogMessage(this, result.Message)); } - tenant.Version = versions[versions.Length - 1]; - db.Entry(tenant).State = EntityState.Modified; - db.SaveChanges(); - } - catch (Exception ex) - { - result.Message = "An Error Occurred Executing Upgrade Logic On Tenant " + tenant.Name + ". " + ex.ToString(); - _filelogger.LogError(Utilities.LogMessage(this, result.Message)); } } } } } - if (string.IsNullOrEmpty(result.Message)) - { - result.Success = true; - } + result.Success = string.IsNullOrEmpty(result.Message); return result; } @@ -588,7 +587,7 @@ namespace Oqtane.Infrastructure // add host role var hostRoleId = roles.GetRoles(user.SiteId, true).FirstOrDefault(item => item.Name == RoleNames.Host)?.RoleId ?? 0; - var userRole = new UserRole { UserId = user.UserId, RoleId = hostRoleId, EffectiveDate = null, ExpiryDate = null }; + var userRole = new UserRole { UserId = user.UserId, RoleId = hostRoleId, EffectiveDate = null, ExpiryDate = null, IgnoreSecurityStamp = true }; userRoles.AddUserRole(userRole); } } diff --git a/Oqtane.Server/Repository/UserRepository.cs b/Oqtane.Server/Repository/UserRepository.cs index ffbf7412..3c0a40ad 100644 --- a/Oqtane.Server/Repository/UserRepository.cs +++ b/Oqtane.Server/Repository/UserRepository.cs @@ -75,6 +75,7 @@ namespace Oqtane.Repository userrole.RoleId = role.RoleId; userrole.EffectiveDate = null; userrole.ExpiryDate = null; + userrole.IgnoreSecurityStamp = true; _userroles.AddUserRole(userrole); } diff --git a/Oqtane.Server/Repository/UserRoleRepository.cs b/Oqtane.Server/Repository/UserRoleRepository.cs index c438bdb4..8af62274 100644 --- a/Oqtane.Server/Repository/UserRoleRepository.cs +++ b/Oqtane.Server/Repository/UserRoleRepository.cs @@ -72,8 +72,13 @@ namespace Oqtane.Repository DeleteUserRoles(userRole.UserId); } - UpdateSecurityStamp(userRole.UserId); - + if (!userRole.IgnoreSecurityStamp) + { + UpdateSecurityStamp(userRole.UserId); + } + + RefreshCache(userRole.UserId); + return userRole; } @@ -83,7 +88,12 @@ namespace Oqtane.Repository db.Entry(userRole).State = EntityState.Modified; db.SaveChanges(); - UpdateSecurityStamp(userRole.UserId); + if (!userRole.IgnoreSecurityStamp) + { + UpdateSecurityStamp(userRole.UserId); + } + + RefreshCache(userRole.UserId); return userRole; } @@ -144,6 +154,7 @@ namespace Oqtane.Repository db.SaveChanges(); UpdateSecurityStamp(userRole.UserId); + RefreshCache(userRole.UserId); } public void DeleteUserRoles(int userId) @@ -156,11 +167,11 @@ namespace Oqtane.Repository db.SaveChanges(); UpdateSecurityStamp(userId); + RefreshCache(userId); } private void UpdateSecurityStamp(int userId) { - // update user security stamp using var db = _dbContextFactory.CreateDbContext(); var user = db.User.Find(userId); if (user != null) @@ -168,11 +179,13 @@ namespace Oqtane.Repository var identityuser = _identityUserManager.FindByNameAsync(user.Username).GetAwaiter().GetResult(); if (identityuser != null) { - _identityUserManager.UpdateSecurityStampAsync(identityuser); + _identityUserManager.UpdateSecurityStampAsync(identityuser).GetAwaiter().GetResult(); } } + } - // refresh cache + private void RefreshCache(int userId) + { var alias = _tenantManager.GetAlias(); if (alias != null) { diff --git a/Oqtane.Shared/Models/UserRole.cs b/Oqtane.Shared/Models/UserRole.cs index b3597ae2..2c891126 100644 --- a/Oqtane.Shared/Models/UserRole.cs +++ b/Oqtane.Shared/Models/UserRole.cs @@ -1,4 +1,5 @@ using System; +using System.ComponentModel.DataAnnotations.Schema; namespace Oqtane.Models { @@ -26,11 +27,18 @@ namespace Oqtane.Models /// Start of when this assignment is valid. See also /// public DateTime? EffectiveDate { get; set; } + /// /// End of when this assignment is valid. See also /// public DateTime? ExpiryDate { get; set; } + /// + /// Indicates that the User Security Stamp should not be updated when this user role is added or updated + /// + [NotMapped] + public bool IgnoreSecurityStamp { get; set; } + /// /// Direct reference to the object. /// TODO: todoc - is this always populated?