diff --git a/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs b/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs index 48e08d596a..7d4dd45fb8 100644 --- a/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs +++ b/src/Umbraco.Core/Configuration/Models/SecuritySettings.cs @@ -15,6 +15,7 @@ namespace Umbraco.Cms.Core.Configuration.Models internal const bool StaticHideDisabledUsersInBackOffice = false; internal const bool StaticAllowPasswordReset = true; internal const string StaticAuthCookieName = "UMB_UCONTEXT"; + internal const string StaticAllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+\\"; /// /// Gets or sets a value indicating whether to keep the user logged in. @@ -50,6 +51,12 @@ namespace Umbraco.Cms.Core.Configuration.Models /// public bool UsernameIsEmail { get; set; } = true; + /// + /// Gets or sets the set of allowed characters for a username + /// + [DefaultValue(StaticAllowedUserNameCharacters)] + public string AllowedUserNameCharacters { get; set; } = StaticAllowedUserNameCharacters; + /// /// Gets or sets a value for the user password settings. /// diff --git a/src/Umbraco.Web.Common/Security/ConfigureMemberIdentityOptions.cs b/src/Umbraco.Web.Common/Security/ConfigureMemberIdentityOptions.cs index cc19670f83..db82ff2b05 100644 --- a/src/Umbraco.Web.Common/Security/ConfigureMemberIdentityOptions.cs +++ b/src/Umbraco.Web.Common/Security/ConfigureMemberIdentityOptions.cs @@ -10,9 +10,13 @@ namespace Umbraco.Cms.Web.Common.Security public sealed class ConfigureMemberIdentityOptions : IConfigureOptions { private readonly MemberPasswordConfigurationSettings _memberPasswordConfiguration; + private readonly SecuritySettings _securitySettings; - public ConfigureMemberIdentityOptions(IOptions memberPasswordConfiguration) - => _memberPasswordConfiguration = memberPasswordConfiguration.Value; + public ConfigureMemberIdentityOptions(IOptions memberPasswordConfiguration, IOptions securitySettings) + { + _memberPasswordConfiguration = memberPasswordConfiguration.Value; + _securitySettings = securitySettings.Value; + } public void Configure(IdentityOptions options) { @@ -22,6 +26,9 @@ namespace Umbraco.Cms.Web.Common.Security options.User.RequireUniqueEmail = true; + // Support validation of member names using Down-Level Logon Name format + options.User.AllowedUserNameCharacters = _securitySettings.AllowedUserNameCharacters; + options.Lockout.AllowedForNewUsers = true; // TODO: Implement this options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromDays(30); diff --git a/src/Umbraco.Web.UI.NetCore/appsettings.json b/src/Umbraco.Web.UI.NetCore/appsettings.json index 8fe1993bcb..a2c0e9c938 100644 --- a/src/Umbraco.Web.UI.NetCore/appsettings.json +++ b/src/Umbraco.Web.UI.NetCore/appsettings.json @@ -46,6 +46,7 @@ "KeepUserLoggedIn": false, "UsernameIsEmail": true, "HideDisabledUsersInBackoffice": false, + "AllowedUserNameCharacters": "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+\\", "UserPassword": { "RequiredLength": 10, "RequireNonLetterOrDigit": false,