diff --git a/Oqtane.Server/Controllers/UserController.cs b/Oqtane.Server/Controllers/UserController.cs index b17efbc8..dce3e443 100644 --- a/Oqtane.Server/Controllers/UserController.cs +++ b/Oqtane.Server/Controllers/UserController.cs @@ -123,8 +123,11 @@ namespace Oqtane.Controllers filtered.UserId = user.UserId; filtered.Username = user.Username; filtered.DisplayName = user.DisplayName; + + // restricted properties filtered.Password = ""; filtered.TwoFactorCode = ""; + filtered.SecurityStamp = ""; // include private properties if authenticated user is accessing their own user account os is an administrator if (_userPermissions.IsAuthorized(User, user.SiteId, EntityNames.User, -1, PermissionNames.Write, RoleNames.Admin) || _userPermissions.GetUser(User).UserId == user.UserId) diff --git a/Oqtane.Server/Managers/UserManager.cs b/Oqtane.Server/Managers/UserManager.cs index 6de9c9d3..6772eb2d 100644 --- a/Oqtane.Server/Managers/UserManager.cs +++ b/Oqtane.Server/Managers/UserManager.cs @@ -64,6 +64,7 @@ namespace Oqtane.Managers { user.SiteId = siteid; user.Roles = GetUserRoles(user.UserId, user.SiteId); + user.SecurityStamp = _identityUserManager.FindByNameAsync(user.Username).GetAwaiter().GetResult()?.SecurityStamp; user.Settings = _settings.GetSettings(EntityNames.User, user.UserId) .ToDictionary(setting => setting.SettingName, setting => setting.SettingValue); } diff --git a/Oqtane.Shared/Models/User.cs b/Oqtane.Shared/Models/User.cs index aca9dd9d..d5009fb5 100644 --- a/Oqtane.Shared/Models/User.cs +++ b/Oqtane.Shared/Models/User.cs @@ -59,6 +59,12 @@ namespace Oqtane.Models /// public DateTime? TwoFactorExpiry { get; set; } + /// + /// A token indicating if a user's security properties have been modified + /// + [NotMapped] + public string SecurityStamp { get; set; } + /// /// Reference to the this user belongs to. /// @@ -66,8 +72,7 @@ namespace Oqtane.Models public int SiteId { get; set; } /// - /// Role names this user has. - /// TODO: todoc - is this comma separated? + /// Semi-colon delimited list of role names for the user /// [NotMapped] public string Roles { get; set; }