using System.Security.Claims;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Umbraco.Cms.Core;
using Umbraco.Cms.Core.Configuration.Models;
using Umbraco.Cms.Core.Security;
using Umbraco.Cms.Web.Common.DependencyInjection;
using Umbraco.Extensions;
namespace Umbraco.Cms.Web.BackOffice.Security;
///
/// Used to configure for the Umbraco Back office
///
public sealed class ConfigureBackOfficeIdentityOptions : IConfigureOptions
{
private readonly UserPasswordConfigurationSettings _userPasswordConfiguration;
private readonly SecuritySettings _securitySettings;
[Obsolete("Use the constructor that accepts SecuritySettings. Will be removed in V13.")]
public ConfigureBackOfficeIdentityOptions(IOptions userPasswordConfiguration)
: this(userPasswordConfiguration, StaticServiceProvider.Instance.GetRequiredService>())
{
}
public ConfigureBackOfficeIdentityOptions(
IOptions userPasswordConfiguration,
IOptions securitySettings)
{
_userPasswordConfiguration = userPasswordConfiguration.Value;
_securitySettings = securitySettings.Value;
}
public void Configure(BackOfficeIdentityOptions options)
{
options.SignIn.RequireConfirmedAccount = true; // uses our custom IUserConfirmation
options.SignIn.RequireConfirmedEmail = false; // not implemented
options.SignIn.RequireConfirmedPhoneNumber = false; // not implemented
options.User.RequireUniqueEmail = true;
// Support validation of users names using Down-Level Logon Name format
options.User.AllowedUserNameCharacters = _securitySettings.AllowedUserNameCharacters;
options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier;
options.ClaimsIdentity.UserNameClaimType = ClaimTypes.Name;
options.ClaimsIdentity.RoleClaimType = ClaimTypes.Role;
options.ClaimsIdentity.SecurityStampClaimType = Constants.Security.SecurityStampClaimType;
options.Lockout.AllowedForNewUsers = true;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(_securitySettings.UserDefaultLockoutTimeInMinutes);
options.Password.ConfigurePasswordOptions(_userPasswordConfiguration);
options.Lockout.MaxFailedAccessAttempts = _userPasswordConfiguration.MaxFailedAccessAttemptsBeforeLockout;
}
}