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?