diff --git a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs index 4a18bf462001..d03fa87a4ac6 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/MemberController.cs @@ -723,6 +723,17 @@ private async Task ValidateMemberDataAsync(MemberSave contentItem) return false; } + // User names can only contain the configured allowed characters. This is validated by ASP.NET Identity on create + // as the setting is applied to the IdentityOptions, but we need to check ourselves for updates. + var allowedUserNameCharacters = _securitySettings.AllowedUserNameCharacters; + if (contentItem.Username.Any(c => allowedUserNameCharacters.Contains(c) == false)) + { + ModelState.AddPropertyError( + new ValidationResult("Username contains invalid characters"), + $"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}login"); + return false; + } + if (contentItem.Password != null && !contentItem.Password.NewPassword.IsNullOrWhiteSpace()) { IdentityResult validPassword = await _memberManager.ValidatePasswordAsync(contentItem.Password.NewPassword); diff --git a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs index c855a87ea4b2..2f128f1f09dd 100644 --- a/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs +++ b/src/Umbraco.Web.BackOffice/Controllers/UsersController.cs @@ -714,6 +714,15 @@ private async Task SendUserInviteEmailAsync(UserBasic? userDisplay, string? from var hasErrors = false; + // User names can only contain the configured allowed characters. This is validated by ASP.NET Identity on create + // as the setting is applied to the BackOfficeIdentityOptions, but we need to check ourselves for updates. + var allowedUserNameCharacters = _securitySettings.AllowedUserNameCharacters; + if (userSave.Username.Any(c => allowedUserNameCharacters.Contains(c) == false)) + { + ModelState.AddModelError("Username", "Username contains invalid characters"); + hasErrors = true; + } + // we need to check if there's any Deny Local login providers present, if so we need to ensure that the user's email address cannot be changed var hasDenyLocalLogin = _externalLogins.HasDenyLocalLogin(); if (hasDenyLocalLogin) diff --git a/src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html b/src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html index eaa92b7a6e78..1eb6840fd3b5 100644 --- a/src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html +++ b/src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html @@ -1,4 +1,4 @@ -
+
@@ -45,6 +45,8 @@ ng-model="model.user.username" umb-auto-focus name="username" required + autocomplete="off" + no-password-manager val-server-field="Username" /> Required