Skip to content

Commit a3b77cf

Browse files
authored
Add validation to prevent update of a user or member to an invalid username (13) (#18261)
* Add validation to prevent update of a user or member to an invalid username. * Avoid password manager updates of user name field on user details screen.
1 parent 4ca68d6 commit a3b77cf

File tree

3 files changed

+23
-1
lines changed

3 files changed

+23
-1
lines changed

src/Umbraco.Web.BackOffice/Controllers/MemberController.cs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -723,6 +723,17 @@ private async Task<bool> ValidateMemberDataAsync(MemberSave contentItem)
723723
return false;
724724
}
725725

726+
// User names can only contain the configured allowed characters. This is validated by ASP.NET Identity on create
727+
// as the setting is applied to the IdentityOptions, but we need to check ourselves for updates.
728+
var allowedUserNameCharacters = _securitySettings.AllowedUserNameCharacters;
729+
if (contentItem.Username.Any(c => allowedUserNameCharacters.Contains(c) == false))
730+
{
731+
ModelState.AddPropertyError(
732+
new ValidationResult("Username contains invalid characters"),
733+
$"{Constants.PropertyEditors.InternalGenericPropertiesPrefix}login");
734+
return false;
735+
}
736+
726737
if (contentItem.Password != null && !contentItem.Password.NewPassword.IsNullOrWhiteSpace())
727738
{
728739
IdentityResult validPassword = await _memberManager.ValidatePasswordAsync(contentItem.Password.NewPassword);

src/Umbraco.Web.BackOffice/Controllers/UsersController.cs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -714,6 +714,15 @@ private async Task SendUserInviteEmailAsync(UserBasic? userDisplay, string? from
714714

715715
var hasErrors = false;
716716

717+
// User names can only contain the configured allowed characters. This is validated by ASP.NET Identity on create
718+
// as the setting is applied to the BackOfficeIdentityOptions, but we need to check ourselves for updates.
719+
var allowedUserNameCharacters = _securitySettings.AllowedUserNameCharacters;
720+
if (userSave.Username.Any(c => allowedUserNameCharacters.Contains(c) == false))
721+
{
722+
ModelState.AddModelError("Username", "Username contains invalid characters");
723+
hasErrors = true;
724+
}
725+
717726
// 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
718727
var hasDenyLocalLogin = _externalLogins.HasDenyLocalLogin();
719728
if (hasDenyLocalLogin)

src/Umbraco.Web.UI.Client/src/views/users/views/user/details.html

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div ng-controller="Umbraco.Editors.Users.DetailsController as vm" class="umb-user-details-details">
1+
<div ng-controller="Umbraco.Editors.Users.DetailsController as vm" class="umb-user-details-details">
22

33
<div class="umb-user-details-details__main-content">
44

@@ -45,6 +45,8 @@
4545
ng-model="model.user.username"
4646
umb-auto-focus name="username"
4747
required
48+
autocomplete="off"
49+
no-password-manager
4850
val-server-field="Username" />
4951
<span ng-messages="userProfileForm.username.$error" show-validation-on-submit>
5052
<span class="help-inline" ng-message="required"><localize key="general_required">Required</localize></span>

0 commit comments

Comments
 (0)