diff --git a/build/NuSpecs/UmbracoCms.Core.nuspec b/build/NuSpecs/UmbracoCms.Core.nuspec
index ce8f3aae44..eeff783d6f 100644
--- a/build/NuSpecs/UmbracoCms.Core.nuspec
+++ b/build/NuSpecs/UmbracoCms.Core.nuspec
@@ -23,41 +23,42 @@
the latter would pick anything below 3.0.0 and that includes prereleases such as 3.0.0-alpha, and we do
not want this to happen as the alpha of the next major is, really, the next major already.
-->
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
+
-
+
+
-
-
+
+
-
+
diff --git a/build/NuSpecs/UmbracoCms.Web.nuspec b/build/NuSpecs/UmbracoCms.Web.nuspec
index 765c45e860..7800d05920 100644
--- a/build/NuSpecs/UmbracoCms.Web.nuspec
+++ b/build/NuSpecs/UmbracoCms.Web.nuspec
@@ -24,16 +24,16 @@
not want this to happen as the alpha of the next major is, really, the next major already.
-->
-
-
-
-
+
+
+
+
+
-
-
+
diff --git a/build/templates/UmbracoSolution/.template.config/template.json b/build/templates/UmbracoSolution/.template.config/template.json
index c222161245..ed83414eb6 100644
--- a/build/templates/UmbracoSolution/.template.config/template.json
+++ b/build/templates/UmbracoSolution/.template.config/template.json
@@ -15,7 +15,7 @@
"version": {
"type": "parameter",
"datatype": "string",
- "defaultValue": "0.5.0-alpha001",
+ "defaultValue": "0.5.0-alpha002",
"description": "The version of Umbraco to load using NuGet",
"replaces": "UMBRACO_VERSION_FROM_TEMPLATE"
},
diff --git a/src/Umbraco.Core/Editors/BackOfficePreviewModel.cs b/src/Umbraco.Core/Editors/BackOfficePreviewModel.cs
index 10d12f30f8..40d145afb0 100644
--- a/src/Umbraco.Core/Editors/BackOfficePreviewModel.cs
+++ b/src/Umbraco.Core/Editors/BackOfficePreviewModel.cs
@@ -1,7 +1,4 @@
using System.Collections.Generic;
-using Umbraco.Core.Configuration;
-using Umbraco.Core.Configuration.UmbracoSettings;
-using Umbraco.Core.Hosting;
using Umbraco.Core.Models;
using Umbraco.Web.Features;
@@ -10,7 +7,7 @@ namespace Umbraco.Web.Editors
public class BackOfficePreviewModel
{
private readonly UmbracoFeatures _features;
-
+
public BackOfficePreviewModel(UmbracoFeatures features, IEnumerable languages)
{
_features = features;
diff --git a/src/Umbraco.Core/HybridBackofficeSecurityAccessor.cs b/src/Umbraco.Core/HybridBackofficeSecurityAccessor.cs
new file mode 100644
index 0000000000..a953ed8b82
--- /dev/null
+++ b/src/Umbraco.Core/HybridBackofficeSecurityAccessor.cs
@@ -0,0 +1,30 @@
+using Umbraco.Core.Cache;
+using Umbraco.Core.Security;
+using Umbraco.Web;
+using Umbraco.Web.Security;
+
+namespace Umbraco.Core
+{
+
+ public class HybridBackofficeSecurityAccessor : HybridAccessorBase, IBackofficeSecurityAccessor
+ {
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ public HybridBackofficeSecurityAccessor(IRequestCache requestCache)
+ : base(requestCache)
+ { }
+
+ ///
+ protected override string ItemKey => "Umbraco.Web.HybridBackofficeSecurityAccessor";
+
+ ///
+ /// Gets or sets the object.
+ ///
+ public IBackofficeSecurity BackofficeSecurity
+ {
+ get => Value;
+ set => Value = value;
+ }
+ }
+}
diff --git a/src/Umbraco.Core/IBackofficeSecurityFactory.cs b/src/Umbraco.Core/IBackofficeSecurityFactory.cs
new file mode 100644
index 0000000000..9f8f791e4c
--- /dev/null
+++ b/src/Umbraco.Core/IBackofficeSecurityFactory.cs
@@ -0,0 +1,15 @@
+using Umbraco.Web.Security;
+
+namespace Umbraco.Core
+{
+ ///
+ /// Creates and manages instances.
+ ///
+ public interface IBackofficeSecurityFactory
+ {
+ ///
+ /// Ensures that a current exists.
+ ///
+ void EnsureBackofficeSecurity();
+ }
+}
diff --git a/src/Umbraco.Core/IUmbracoContext.cs b/src/Umbraco.Core/IUmbracoContext.cs
index 66b3dc3965..03fb305fb6 100644
--- a/src/Umbraco.Core/IUmbracoContext.cs
+++ b/src/Umbraco.Core/IUmbracoContext.cs
@@ -16,9 +16,9 @@ namespace Umbraco.Web
DateTime ObjectCreated { get; }
///
- /// Gets the WebSecurity class
+ /// Gets the BackofficeSecurity class
///
- IWebSecurity Security { get; }
+ IBackofficeSecurity Security { get; }
///
/// Gets the uri that is handled by ASP.NET after server-side rewriting took place.
diff --git a/src/Umbraco.Core/Models/IconModel.cs b/src/Umbraco.Core/Models/IconModel.cs
index 5c79ad6219..12fa8884ae 100644
--- a/src/Umbraco.Core/Models/IconModel.cs
+++ b/src/Umbraco.Core/Models/IconModel.cs
@@ -1,4 +1,4 @@
-namespace Umbraco.Web.Models
+namespace Umbraco.Core.Models
{
public class IconModel
{
diff --git a/src/Umbraco.Core/Models/PublishedContent/ModelType.cs b/src/Umbraco.Core/Models/PublishedContent/ModelType.cs
index dd60eb9beb..94e7958780 100644
--- a/src/Umbraco.Core/Models/PublishedContent/ModelType.cs
+++ b/src/Umbraco.Core/Models/PublishedContent/ModelType.cs
@@ -390,7 +390,6 @@ namespace Umbraco.Core.Models.PublishedContent
protected override bool IsCOMObjectImpl()
=> false;
-
public override object InvokeMember(string name, BindingFlags invokeAttr, Binder binder, object target, object[] args, ParameterModifier[] modifiers, CultureInfo culture, string[] namedParameters)
{
throw new NotSupportedException();
diff --git a/src/Umbraco.Core/Security/IWebSecurity.cs b/src/Umbraco.Core/Security/IBackofficeSecurity.cs
similarity index 97%
rename from src/Umbraco.Core/Security/IWebSecurity.cs
rename to src/Umbraco.Core/Security/IBackofficeSecurity.cs
index 594f6d96ea..3a0e0baa1d 100644
--- a/src/Umbraco.Core/Security/IWebSecurity.cs
+++ b/src/Umbraco.Core/Security/IBackofficeSecurity.cs
@@ -4,7 +4,7 @@ using Umbraco.Core.Models.Membership;
namespace Umbraco.Web.Security
{
- public interface IWebSecurity
+ public interface IBackofficeSecurity
{
///
/// Gets the current user.
diff --git a/src/Umbraco.Core/Security/IBackofficeSecurityAccessor.cs b/src/Umbraco.Core/Security/IBackofficeSecurityAccessor.cs
new file mode 100644
index 0000000000..d3cea99f9f
--- /dev/null
+++ b/src/Umbraco.Core/Security/IBackofficeSecurityAccessor.cs
@@ -0,0 +1,9 @@
+using Umbraco.Web.Security;
+
+namespace Umbraco.Core.Security
+{
+ public interface IBackofficeSecurityAccessor
+ {
+ IBackofficeSecurity BackofficeSecurity { get; set; }
+ }
+}
diff --git a/src/Umbraco.Core/Services/IIconService.cs b/src/Umbraco.Core/Services/IIconService.cs
new file mode 100644
index 0000000000..9ae9164c72
--- /dev/null
+++ b/src/Umbraco.Core/Services/IIconService.cs
@@ -0,0 +1,22 @@
+using System.Collections.Generic;
+using Umbraco.Core.Models;
+using Umbraco.Web.Models;
+
+namespace Umbraco.Core.Services
+{
+ public interface IIconService
+ {
+ ///
+ /// Gets an IconModel containing the icon name and SvgString according to an icon name found at the global icons path
+ ///
+ ///
+ ///
+ IconModel GetIcon(string iconName);
+
+ ///
+ /// Gets a list of all svg icons found at at the global icons path.
+ ///
+ ///
+ IList GetAllIcons();
+ }
+}
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index 9634baf960..43e3d208f0 100644
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -18,8 +18,8 @@
-
-
+
+
diff --git a/src/Umbraco.Infrastructure/BackOffice/BackOfficeUserManager.cs b/src/Umbraco.Infrastructure/BackOffice/BackOfficeUserManager.cs
index 6e11e20c8f..8a7186da77 100644
--- a/src/Umbraco.Infrastructure/BackOffice/BackOfficeUserManager.cs
+++ b/src/Umbraco.Infrastructure/BackOffice/BackOfficeUserManager.cs
@@ -14,7 +14,7 @@ using Umbraco.Net;
namespace Umbraco.Core.BackOffice
{
- public class BackOfficeUserManager : BackOfficeUserManager
+ public class BackOfficeUserManager : BackOfficeUserManager, IBackOfficeUserManager
{
public BackOfficeUserManager(
IIpResolver ipResolver,
diff --git a/src/Umbraco.Infrastructure/BackOffice/IBackOfficeUserManager.cs b/src/Umbraco.Infrastructure/BackOffice/IBackOfficeUserManager.cs
new file mode 100644
index 0000000000..e4cff3e042
--- /dev/null
+++ b/src/Umbraco.Infrastructure/BackOffice/IBackOfficeUserManager.cs
@@ -0,0 +1,271 @@
+using System;
+using System.Collections.Generic;
+using System.Security.Principal;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Identity;
+
+
+namespace Umbraco.Core.BackOffice
+{
+ public interface IBackOfficeUserManager : IBackOfficeUserManager
+ {
+
+ }
+ public interface IBackOfficeUserManager: IDisposable
+ where TUser : BackOfficeIdentityUser
+ {
+
+ ///
+ /// Finds and returns a user, if any, who has the specified .
+ ///
+ /// The user ID to search for.
+ ///
+ /// The that represents the asynchronous operation, containing the user matching the specified if it exists.
+ ///
+ Task FindByIdAsync(string userId);
+
+ ///
+ /// Generates a password reset token for the specified , using
+ /// the configured password reset token provider.
+ ///
+ /// The user to generate a password reset token for.
+ /// The that represents the asynchronous operation,
+ /// containing a password reset token for the specified .
+ Task GeneratePasswordResetTokenAsync(TUser user);
+
+ ///
+ /// This is a special method that will reset the password but will raise the Password Changed event instead of the reset event
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ /// We use this because in the back office the only way an admin can change another user's password without first knowing their password
+ /// is to generate a token and reset it, however, when we do this we want to track a password change, not a password reset
+ ///
+ Task ChangePasswordWithResetAsync(int userId, string token, string newPassword);
+
+ ///
+ /// Validates that an email confirmation token matches the specified .
+ ///
+ /// The user to validate the token against.
+ /// The email confirmation token to validate.
+ ///
+ /// The that represents the asynchronous operation, containing the
+ /// of the operation.
+ ///
+ Task ConfirmEmailAsync(TUser user, string token);
+
+ ///
+ /// Gets the user, if any, associated with the normalized value of the specified email address.
+ /// Note: Its recommended that identityOptions.User.RequireUniqueEmail be set to true when using this method, otherwise
+ /// the store may throw if there are users with duplicate emails.
+ ///
+ /// The email address to return the user for.
+ ///
+ /// The task object containing the results of the asynchronous lookup operation, the user, if any, associated with a normalized value of the specified email address.
+ ///
+ Task FindByEmailAsync(string email);
+
+ ///
+ /// Resets the 's password to the specified after
+ /// validating the given password reset .
+ ///
+ /// The user whose password should be reset.
+ /// The password reset token to verify.
+ /// The new password to set if reset token verification succeeds.
+ ///
+ /// The that represents the asynchronous operation, containing the
+ /// of the operation.
+ ///
+ Task ResetPasswordAsync(TUser user, string token, string newPassword);
+
+ ///
+ /// Override to check the user approval value as well as the user lock out date, by default this only checks the user's locked out date
+ ///
+ ///
+ ///
+ ///
+ /// In the ASP.NET Identity world, there is only one value for being locked out, in Umbraco we have 2 so when checking this for Umbraco we need to check both values
+ ///
+ Task IsLockedOutAsync(TUser user);
+
+ ///
+ /// Locks out a user until the specified end date has passed. Setting a end date in the past immediately unlocks a user.
+ ///
+ /// The user whose lockout date should be set.
+ /// The after which the 's lockout should end.
+ /// The that represents the asynchronous operation, containing the of the operation.
+ Task SetLockoutEndDateAsync(TUser user, DateTimeOffset? lockoutEnd);
+
+ ///
+ /// Gets a flag indicating whether the email address for the specified has been verified, true if the email address is verified otherwise
+ /// false.
+ ///
+ /// The user whose email confirmation status should be returned.
+ ///
+ /// The task object containing the results of the asynchronous operation, a flag indicating whether the email address for the specified
+ /// has been confirmed or not.
+ ///
+ Task IsEmailConfirmedAsync(TUser user);
+
+ ///
+ /// Updates the specified in the backing store.
+ ///
+ /// The user to update.
+ ///
+ /// The that represents the asynchronous operation, containing the
+ /// of the operation.
+ ///
+ Task UpdateAsync(TUser user);
+
+ ///
+ /// Returns a flag indicating whether the specified is valid for
+ /// the given and .
+ ///
+ /// The user to validate the token against.
+ /// The token provider used to generate the token.
+ /// The purpose the token should be generated for.
+ /// The token to validate
+ ///
+ /// The that represents the asynchronous operation, returning true if the
+ /// is valid, otherwise false.
+ ///
+ Task VerifyUserTokenAsync(TUser user, string tokenProvider, string purpose,
+ string token);
+
+ ///
+ /// Adds the to the specified only if the user
+ /// does not already have a password.
+ ///
+ /// The user whose password should be set.
+ /// The password to set.
+ ///
+ /// The that represents the asynchronous operation, containing the
+ /// of the operation.
+ ///
+ Task AddPasswordAsync(TUser user, string password);
+
+
+ ///
+ /// Returns a flag indicating whether the given is valid for the
+ /// specified .
+ ///
+ /// The user whose password should be validated.
+ /// The password to validate
+ /// The that represents the asynchronous operation, containing true if
+ /// the specified matches the one store for the ,
+ /// otherwise false.
+ Task CheckPasswordAsync(TUser user, string password);
+
+ ///
+ /// Changes a user's password after confirming the specified is correct,
+ /// as an asynchronous operation.
+ ///
+ /// The user whose password should be set.
+ /// The current password to validate before changing.
+ /// The new password to set for the specified .
+ ///
+ /// The that represents the asynchronous operation, containing the
+ /// of the operation.
+ ///
+ Task ChangePasswordAsync(TUser user, string currentPassword,
+ string newPassword);
+
+ ///
+ /// Used to validate a user's session
+ ///
+ ///
+ ///
+ ///
+ Task ValidateSessionIdAsync(string userId, string sessionId);
+
+ ///
+ /// Creates the specified in the backing store with no password,
+ /// as an asynchronous operation.
+ ///
+ /// The user to create.
+ ///
+ /// The that represents the asynchronous operation, containing the
+ /// of the operation.
+ ///
+ Task CreateAsync(TUser user);
+
+ ///
+ /// Helper method to generate a password for a user based on the current password validator
+ ///
+ ///
+ string GeneratePassword();
+
+
+ ///
+ /// Generates an email confirmation token for the specified user.
+ ///
+ /// The user to generate an email confirmation token for.
+ ///
+ /// The that represents the asynchronous operation, an email confirmation token.
+ ///
+ Task GenerateEmailConfirmationTokenAsync(TUser user);
+
+ ///
+ /// Finds and returns a user, if any, who has the specified user name.
+ ///
+ /// The user name to search for.
+ ///
+ /// The that represents the asynchronous operation, containing the user matching the specified if it exists.
+ ///
+ Task FindByNameAsync(string userName);
+
+ ///
+ /// Increments the access failed count for the user as an asynchronous operation.
+ /// If the failed access account is greater than or equal to the configured maximum number of attempts,
+ /// the user will be locked out for the configured lockout time span.
+ ///
+ /// The user whose failed access count to increment.
+ /// The that represents the asynchronous operation, containing the of the operation.
+ Task AccessFailedAsync(TUser user);
+
+ ///
+ /// Returns a flag indicating whether the specified has two factor authentication enabled or not,
+ /// as an asynchronous operation.
+ ///
+ /// The user whose two factor authentication enabled status should be retrieved.
+ ///
+ /// The that represents the asynchronous operation, true if the specified
+ /// has two factor authentication enabled, otherwise false.
+ ///
+ Task GetTwoFactorEnabledAsync(TUser user);
+
+ ///
+ /// Gets a list of valid two factor token providers for the specified ,
+ /// as an asynchronous operation.
+ ///
+ /// The user the whose two factor authentication providers will be returned.
+ ///
+ /// The that represents result of the asynchronous operation, a list of two
+ /// factor authentication providers for the specified user.
+ ///
+ Task> GetValidTwoFactorProvidersAsync(TUser user);
+
+ ///
+ /// Verifies the specified two factor authentication against the .
+ ///
+ /// The user the token is supposed to be for.
+ /// The provider which will verify the token.
+ /// The token to verify.
+ ///
+ /// The that represents result of the asynchronous operation, true if the token is valid,
+ /// otherwise false.
+ ///
+ Task VerifyTwoFactorTokenAsync(TUser user, string tokenProvider, string token);
+
+ Task ResetAccessFailedCountAsync(TUser user);
+
+ void RaiseForgotPasswordRequestedEvent(IPrincipal currentUser, int userId);
+ void RaiseForgotPasswordChangedSuccessEvent(IPrincipal currentUser, int userId);
+ void RaiseLogoutSuccessEvent(IPrincipal currentUser, int userId);
+
+ void RaiseLoginSuccessEvent(TUser currentUser, int userId);
+ }
+}
diff --git a/src/Umbraco.Web/Compose/BlockEditorComponent.cs b/src/Umbraco.Infrastructure/Compose/BlockEditorComponent.cs
similarity index 100%
rename from src/Umbraco.Web/Compose/BlockEditorComponent.cs
rename to src/Umbraco.Infrastructure/Compose/BlockEditorComponent.cs
diff --git a/src/Umbraco.Web/Compose/BlockEditorComposer.cs b/src/Umbraco.Infrastructure/Compose/BlockEditorComposer.cs
similarity index 100%
rename from src/Umbraco.Web/Compose/BlockEditorComposer.cs
rename to src/Umbraco.Infrastructure/Compose/BlockEditorComposer.cs
diff --git a/src/Umbraco.Web/Compose/NestedContentPropertyComponent.cs b/src/Umbraco.Infrastructure/Compose/NestedContentPropertyComponent.cs
similarity index 100%
rename from src/Umbraco.Web/Compose/NestedContentPropertyComponent.cs
rename to src/Umbraco.Infrastructure/Compose/NestedContentPropertyComponent.cs
diff --git a/src/Umbraco.Web/Compose/NestedContentPropertyComposer.cs b/src/Umbraco.Infrastructure/Compose/NestedContentPropertyComposer.cs
similarity index 100%
rename from src/Umbraco.Web/Compose/NestedContentPropertyComposer.cs
rename to src/Umbraco.Infrastructure/Compose/NestedContentPropertyComposer.cs
diff --git a/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs b/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs
index f2e9556a48..96e4a9ae34 100644
--- a/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs
+++ b/src/Umbraco.Infrastructure/Install/InstallSteps/NewInstallStep.cs
@@ -34,7 +34,7 @@ namespace Umbraco.Web.Install.InstallSteps
private readonly SecuritySettings _securitySettings;
private readonly ConnectionStrings _connectionStrings;
private readonly ICookieManager _cookieManager;
- private readonly BackOfficeUserManager _userManager;
+ private readonly IBackOfficeUserManager _userManager;
public NewInstallStep(
IUserService userService,
@@ -43,7 +43,7 @@ namespace Umbraco.Web.Install.InstallSteps
IOptions securitySettings,
IOptions connectionStrings,
ICookieManager cookieManager,
- BackOfficeUserManager userManager)
+ IBackOfficeUserManager userManager)
{
_userService = userService ?? throw new ArgumentNullException(nameof(userService));
_databaseBuilder = databaseBuilder ?? throw new ArgumentNullException(nameof(databaseBuilder));
diff --git a/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitDownloadStep.cs b/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitDownloadStep.cs
index 24133d3be1..d060db2c43 100644
--- a/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitDownloadStep.cs
+++ b/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitDownloadStep.cs
@@ -5,6 +5,7 @@ using System.Threading.Tasks;
using Umbraco.Core.Services;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models.Packaging;
+using Umbraco.Core.Security;
using Umbraco.Net;
using Umbraco.Web.Install.Models;
using Umbraco.Web.Security;
@@ -17,16 +18,16 @@ namespace Umbraco.Web.Install.InstallSteps
internal class StarterKitDownloadStep : InstallSetupStep
{
private readonly InstallHelper _installHelper;
- private readonly IWebSecurity _webSecurity;
+ private readonly IBackofficeSecurityAccessor _backofficeSecurityAccessor;
private readonly IUmbracoVersion _umbracoVersion;
private readonly IUmbracoApplicationLifetime _umbracoApplicationLifetime;
private readonly IContentService _contentService;
private readonly IPackagingService _packageService;
- public StarterKitDownloadStep(IContentService contentService, IPackagingService packageService, InstallHelper installHelper, IWebSecurity webSecurity, IUmbracoVersion umbracoVersion, IUmbracoApplicationLifetime umbracoApplicationLifetime)
+ public StarterKitDownloadStep(IContentService contentService, IPackagingService packageService, InstallHelper installHelper, IBackofficeSecurityAccessor backofficeSecurityAccessor, IUmbracoVersion umbracoVersion, IUmbracoApplicationLifetime umbracoApplicationLifetime)
{
_installHelper = installHelper;
- _webSecurity = webSecurity;
+ _backofficeSecurityAccessor = backofficeSecurityAccessor;
_umbracoVersion = umbracoVersion;
_umbracoApplicationLifetime = umbracoApplicationLifetime;
_contentService = contentService;
@@ -67,7 +68,7 @@ namespace Umbraco.Web.Install.InstallSteps
private async Task<(string packageFile, int packageId)> DownloadPackageFilesAsync(Guid kitGuid)
{
//Go get the package file from the package repo
- var packageFile = await _packageService.FetchPackageFileAsync(kitGuid, _umbracoVersion.Current, _webSecurity.GetUserId().ResultOr(0));
+ var packageFile = await _packageService.FetchPackageFileAsync(kitGuid, _umbracoVersion.Current, _backofficeSecurityAccessor.BackofficeSecurity.GetUserId().ResultOr(0));
if (packageFile == null) throw new InvalidOperationException("Could not fetch package file " + kitGuid);
//add an entry to the installedPackages.config
@@ -77,7 +78,7 @@ namespace Umbraco.Web.Install.InstallSteps
_packageService.SaveInstalledPackage(packageDefinition);
- _packageService.InstallCompiledPackageFiles(packageDefinition, packageFile, _webSecurity.GetUserId().ResultOr(-1));
+ _packageService.InstallCompiledPackageFiles(packageDefinition, packageFile, _backofficeSecurityAccessor.BackofficeSecurity.GetUserId().ResultOr(-1));
return (compiledPackage.PackageFile.Name, packageDefinition.Id);
}
diff --git a/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitInstallStep.cs b/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitInstallStep.cs
index daf8255132..0f2394dcf4 100644
--- a/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitInstallStep.cs
+++ b/src/Umbraco.Infrastructure/Install/InstallSteps/StarterKitInstallStep.cs
@@ -2,6 +2,7 @@
using System.IO;
using System.Linq;
using System.Threading.Tasks;
+using Umbraco.Core.Security;
using Umbraco.Net;
using Umbraco.Core.Services;
using Umbraco.Web.Install.Models;
@@ -15,13 +16,13 @@ namespace Umbraco.Web.Install.InstallSteps
internal class StarterKitInstallStep : InstallSetupStep