diff --git a/src/Umbraco.Core/Security/AuthenticationExtensions.cs b/src/Umbraco.Core/Security/AuthenticationExtensions.cs
deleted file mode 100644
index 7c3e835a77..0000000000
--- a/src/Umbraco.Core/Security/AuthenticationExtensions.cs
+++ /dev/null
@@ -1,65 +0,0 @@
-using System;
-using System.Collections.Concurrent;
-using System.Globalization;
-using System.Linq;
-using System.Security.Claims;
-using System.Security.Principal;
-using System.Threading;
-
-namespace Umbraco.Core.Security
-{
- public static class AuthenticationExtensions
- {
- ///
- /// This will return the current back office identity if the IPrincipal is the correct type
- ///
- ///
- ///
- internal static UmbracoBackOfficeIdentity GetUmbracoIdentity(this IPrincipal user)
- {
- //If it's already a UmbracoBackOfficeIdentity
- if (user.Identity is UmbracoBackOfficeIdentity backOfficeIdentity) return backOfficeIdentity;
-
- //Check if there's more than one identity assigned and see if it's a UmbracoBackOfficeIdentity and use that
- if (user is ClaimsPrincipal claimsPrincipal)
- {
- backOfficeIdentity = claimsPrincipal.Identities.OfType().FirstOrDefault();
- if (backOfficeIdentity != null) return backOfficeIdentity;
- }
-
- //Otherwise convert to a UmbracoBackOfficeIdentity if it's auth'd and has the back office session
- if (user.Identity is ClaimsIdentity claimsIdentity && claimsIdentity.IsAuthenticated && claimsIdentity.HasClaim(x => x.Type == Constants.Security.SessionIdClaimType))
- {
- try
- {
- return UmbracoBackOfficeIdentity.FromClaimsIdentity(claimsIdentity);
- }
- catch (InvalidOperationException)
- {
- }
- }
-
- return null;
- }
-
- ///
- /// Ensures that the thread culture is set based on the back office user's culture
- ///
- ///
- internal static void EnsureCulture(this IIdentity identity)
- {
- if (identity is UmbracoBackOfficeIdentity umbIdentity && umbIdentity.IsAuthenticated)
- {
- Thread.CurrentThread.CurrentUICulture =
- Thread.CurrentThread.CurrentCulture = UserCultures.GetOrAdd(umbIdentity.Culture, s => new CultureInfo(s));
- }
- }
-
-
- ///
- /// Used so that we aren't creating a new CultureInfo object for every single request
- ///
- private static readonly ConcurrentDictionary UserCultures = new ConcurrentDictionary();
-
- }
-}
diff --git a/src/Umbraco.Core/Umbraco.Core.csproj b/src/Umbraco.Core/Umbraco.Core.csproj
index ed3726a74c..b194102f12 100755
--- a/src/Umbraco.Core/Umbraco.Core.csproj
+++ b/src/Umbraco.Core/Umbraco.Core.csproj
@@ -126,31 +126,11 @@
Constants.cs
-->
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Properties\SolutionInfo.cs
diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs
index 7169b93cb4..af99b3f843 100644
--- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs
+++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Configuration.cs
@@ -1,6 +1,8 @@
-using Umbraco.Core.Configuration.UmbracoSettings;
+using Umbraco.Core;
+using Umbraco.Core.Composing;
+using Umbraco.Core.Configuration.UmbracoSettings;
-namespace Umbraco.Core.Composing.CompositionExtensions
+namespace Umbraco.Web.Composing.CompositionExtensions
{
///
/// Compose configurations.
diff --git a/src/Umbraco.Core/Composing/CompositionExtensions/CoreMappingProfiles.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs
similarity index 51%
rename from src/Umbraco.Core/Composing/CompositionExtensions/CoreMappingProfiles.cs
rename to src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs
index 165fa10be7..8d7098a0fb 100644
--- a/src/Umbraco.Core/Composing/CompositionExtensions/CoreMappingProfiles.cs
+++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/CoreMappingProfiles.cs
@@ -1,7 +1,8 @@
-using Umbraco.Core.Mapping;
-using Umbraco.Core.Models.Identity;
+using Umbraco.Core;
+using Umbraco.Core.Composing;
+using Umbraco.Core.Mapping;
-namespace Umbraco.Core.Composing.CompositionExtensions
+namespace Umbraco.Web.Composing.CompositionExtensions
{
public static class CoreMappingProfiles
@@ -9,8 +10,7 @@ namespace Umbraco.Core.Composing.CompositionExtensions
public static Composition ComposeCoreMappingProfiles(this Composition composition)
{
composition.RegisterUnique();
- composition.WithCollectionBuilder()
- .Add();
+
return composition;
}
}
diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs
index e13b4f9477..caa228d922 100644
--- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs
+++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/FileSystems.cs
@@ -1,9 +1,12 @@
-using Umbraco.Core.Configuration;
+using Umbraco.Core.Composing;
+using Umbraco.Web.Composing;
+using Umbraco.Core.Configuration;
using Umbraco.Core.IO;
using Umbraco.Core.IO.MediaPathSchemes;
using Umbraco.Core.Logging;
+using Umbraco.Core;
-namespace Umbraco.Core.Composing.CompositionExtensions
+namespace Umbraco.Web.Composing.CompositionExtensions
{
internal static class FileSystems
{
@@ -74,10 +77,10 @@ namespace Umbraco.Core.Composing.CompositionExtensions
// it needs to be registered (not only the interface) because it provides additional
// functionality eg for scoping, and is injected in the scope provider - whereas the
// interface is really for end-users to get access to filesystems.
- composition.RegisterUnique(factory => factory.CreateInstance(factory));
+ composition.RegisterUnique(factory => factory.CreateInstance(factory));
// register IFileSystems, which gives access too all filesystems
- composition.RegisterUnique(factory => factory.GetInstance());
+ composition.RegisterUnique(factory => factory.GetInstance());
// register the scheme for media paths
composition.RegisterUnique();
diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs
index 0939dd0f71..de2361549f 100644
--- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs
+++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Repositories.cs
@@ -1,7 +1,9 @@
-using Umbraco.Core.Persistence.Repositories;
+using Umbraco.Core;
+using Umbraco.Core.Composing;
+using Umbraco.Core.Persistence.Repositories;
using Umbraco.Core.Persistence.Repositories.Implement;
-namespace Umbraco.Core.Composing.CompositionExtensions
+namespace Umbraco.Web.Composing.CompositionExtensions
{
///
/// Composes repositories.
diff --git a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs
index c746c2b8b4..b923b0ced8 100644
--- a/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs
+++ b/src/Umbraco.Infrastructure/Composing/CompositionExtensions/Services.cs
@@ -1,7 +1,9 @@
using System;
using System.IO;
using System.Linq;
+using Umbraco.Core;
using Umbraco.Core.Cache;
+using Umbraco.Core.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Dictionary;
using Umbraco.Core.Events;
@@ -11,7 +13,7 @@ using Umbraco.Core.Packaging;
using Umbraco.Core.Services;
using Umbraco.Core.Services.Implement;
-namespace Umbraco.Core.Composing.CompositionExtensions
+namespace Umbraco.Web.Composing.CompositionExtensions
{
internal static class Services
{
diff --git a/src/Umbraco.Infrastructure/Models/Membership/User.cs b/src/Umbraco.Infrastructure/Models/Membership/User.cs
index ed35aea8f3..30e99af04f 100644
--- a/src/Umbraco.Infrastructure/Models/Membership/User.cs
+++ b/src/Umbraco.Infrastructure/Models/Membership/User.cs
@@ -322,7 +322,7 @@ namespace Umbraco.Core.Models.Membership
}
[IgnoreDataMember]
- internal bool DefaultToLiveEditing
+ public bool DefaultToLiveEditing
{
get => _defaultToLiveEditing;
set => SetPropertyValueAndDetectChanges(value, ref _defaultToLiveEditing, nameof(DefaultToLiveEditing));
diff --git a/src/Umbraco.Core/Runtime/CoreInitialComposer.cs b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs
similarity index 97%
rename from src/Umbraco.Core/Runtime/CoreInitialComposer.cs
rename to src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs
index 159eb8bca9..4f21944a38 100644
--- a/src/Umbraco.Core/Runtime/CoreInitialComposer.cs
+++ b/src/Umbraco.Infrastructure/Runtime/CoreInitialComposer.cs
@@ -1,25 +1,21 @@
using System;
using Umbraco.Core.Cache;
using Umbraco.Core.Composing;
-using Umbraco.Core.Composing.CompositionExtensions;
+using Umbraco.Web.Composing.CompositionExtensions;
using Umbraco.Core.Configuration;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Hosting;
using Umbraco.Core.Dictionary;
-using Umbraco.Core.IO;
using Umbraco.Core.Logging;
using Umbraco.Core.Manifest;
using Umbraco.Core.Migrations;
using Umbraco.Core.Migrations.Install;
using Umbraco.Core.Migrations.PostMigrations;
using Umbraco.Core.Models.PublishedContent;
-using Umbraco.Core.PackageActions;
using Umbraco.Core.Persistence;
-using Umbraco.Core.Persistence.Mappers;
using Umbraco.Core.PropertyEditors;
using Umbraco.Core.PropertyEditors.Validators;
using Umbraco.Core.Scoping;
-using Umbraco.Core.Security;
using Umbraco.Core.Serialization;
using Umbraco.Core.Services;
using Umbraco.Core.Strings;
diff --git a/src/Umbraco.Core/Runtime/CoreRuntime.cs b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs
similarity index 98%
rename from src/Umbraco.Core/Runtime/CoreRuntime.cs
rename to src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs
index 077ce2b760..17b6486856 100644
--- a/src/Umbraco.Core/Runtime/CoreRuntime.cs
+++ b/src/Umbraco.Infrastructure/Runtime/CoreRuntime.cs
@@ -169,12 +169,9 @@ namespace Umbraco.Core.Runtime
// type finder/loader
var typeLoader = new TypeLoader(IOHelper, TypeFinder, appCaches.RuntimeCache, new DirectoryInfo(HostingEnvironment.LocalTempPath), ProfilingLogger);
- // main dom
- var mainDom = new MainDom(Logger, HostingEnvironment);
-
// create the composition
composition = new Composition(register, typeLoader, ProfilingLogger, _state, Configs, IOHelper, appCaches);
- composition.RegisterEssentials(Logger, Profiler, ProfilingLogger, mainDom, appCaches, databaseFactory, typeLoader, _state, TypeFinder, IOHelper, UmbracoVersion, DbProviderFactoryCreator, BulkSqlInsertProvider);
+ composition.RegisterEssentials(Logger, Profiler, ProfilingLogger, MainDom, appCaches, databaseFactory, typeLoader, _state, TypeFinder, IOHelper, UmbracoVersion, DbProviderFactoryCreator, BulkSqlInsertProvider);
// run handlers
RuntimeOptions.DoRuntimeEssentials(composition, appCaches, typeLoader, databaseFactory);
diff --git a/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs b/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs
index e551017295..4876772c86 100644
--- a/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs
+++ b/src/Umbraco.Infrastructure/Services/Implement/MemberService.cs
@@ -546,7 +546,7 @@ namespace Umbraco.Core.Services.Implement
return _memberRepository.GetPage(query, pageIndex, pageSize, out totalRecords, null, Ordering.By("Name"));
}
}
-
+
///
/// Finds a list of objects by a partial email string
///
@@ -1114,7 +1114,7 @@ namespace Umbraco.Core.Services.Implement
///
/// Occurs after members have been exported.
///
- internal static event TypedEventHandler Exported;
+ public static event TypedEventHandler Exported;
#endregion
diff --git a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj
index 5667c6b1f6..41509aec4c 100644
--- a/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj
+++ b/src/Umbraco.Infrastructure/Umbraco.Infrastructure.csproj
@@ -61,10 +61,6 @@
-
-
-
-
diff --git a/src/Umbraco.Tests/IO/FileSystemsTests.cs b/src/Umbraco.Tests/IO/FileSystemsTests.cs
index 8b8b71304a..11eb9242aa 100644
--- a/src/Umbraco.Tests/IO/FileSystemsTests.cs
+++ b/src/Umbraco.Tests/IO/FileSystemsTests.cs
@@ -13,7 +13,7 @@ using Umbraco.Core.Logging;
using Umbraco.Core.Services;
using Umbraco.Tests.Components;
using Umbraco.Tests.TestHelpers;
-using Umbraco.Core.Composing.CompositionExtensions;
+using Umbraco.Web.Composing.CompositionExtensions;
using Current = Umbraco.Web.Composing.Current;
using FileSystems = Umbraco.Core.IO.FileSystems;
diff --git a/src/Umbraco.Tests/Models/ContentExtensionsTests.cs b/src/Umbraco.Tests/Models/ContentExtensionsTests.cs
index 87bd661015..5e10ad5552 100644
--- a/src/Umbraco.Tests/Models/ContentExtensionsTests.cs
+++ b/src/Umbraco.Tests/Models/ContentExtensionsTests.cs
@@ -3,7 +3,7 @@ using System.Linq;
using Moq;
using NUnit.Framework;
using Umbraco.Core;
-using Umbraco.Core.Composing.CompositionExtensions;
+using Umbraco.Web.Composing.CompositionExtensions;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
diff --git a/src/Umbraco.Tests/Models/ContentTests.cs b/src/Umbraco.Tests/Models/ContentTests.cs
index c7bb4415bc..68ab217865 100644
--- a/src/Umbraco.Tests/Models/ContentTests.cs
+++ b/src/Umbraco.Tests/Models/ContentTests.cs
@@ -10,7 +10,7 @@ using Umbraco.Core;
using NUnit.Framework;
using Umbraco.Core.Cache;
using Umbraco.Core.Composing;
-using Umbraco.Core.Composing.CompositionExtensions;
+using Umbraco.Web.Composing.CompositionExtensions;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Logging;
using Umbraco.Core.Models;
diff --git a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs
index ad65ef0a47..2b1722832f 100644
--- a/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs
+++ b/src/Umbraco.Tests/Models/Mapping/ContentWebModelMappingTests.cs
@@ -3,7 +3,7 @@ using System.Linq;
using Moq;
using NUnit.Framework;
using Umbraco.Core;
-using Umbraco.Core.Composing.CompositionExtensions;
+using Umbraco.Web.Composing.CompositionExtensions;
using Umbraco.Core.Configuration.UmbracoSettings;
using Umbraco.Core.Services;
using Umbraco.Core.Logging;
diff --git a/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs b/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs
index b0702f0063..b4ee163df0 100644
--- a/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs
+++ b/src/Umbraco.Tests/Packaging/PackageDataInstallationTests.cs
@@ -16,7 +16,7 @@ using Umbraco.Core.Services;
using Umbraco.Tests.Services;
using Umbraco.Tests.Services.Importing;
using Umbraco.Tests.Testing;
-using Umbraco.Core.Composing.CompositionExtensions;
+using Umbraco.Web.Composing.CompositionExtensions;
using Umbraco.Core.Configuration;
using Umbraco.Core.Strings;
diff --git a/src/Umbraco.Tests/Scoping/ScopeFileSystemsTests.cs b/src/Umbraco.Tests/Scoping/ScopeFileSystemsTests.cs
index 6b16f49d7d..8d55db6b19 100644
--- a/src/Umbraco.Tests/Scoping/ScopeFileSystemsTests.cs
+++ b/src/Umbraco.Tests/Scoping/ScopeFileSystemsTests.cs
@@ -8,7 +8,7 @@ using Umbraco.Web.Composing;
using Umbraco.Core.IO;
using Umbraco.Tests.TestHelpers;
using Umbraco.Tests.Testing;
-using Umbraco.Core.Composing.CompositionExtensions;
+using Umbraco.Web.Composing.CompositionExtensions;
using Umbraco.Core.Logging;
using FileSystems = Umbraco.Core.IO.FileSystems;
diff --git a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs
index 014959cd1f..1556d0999f 100644
--- a/src/Umbraco.Tests/Testing/UmbracoTestBase.cs
+++ b/src/Umbraco.Tests/Testing/UmbracoTestBase.cs
@@ -38,7 +38,7 @@ using Umbraco.Web.Actions;
using Umbraco.Web.ContentApps;
using Umbraco.Web.PublishedCache;
using Umbraco.Web.Routing;
-using Umbraco.Core.Composing.CompositionExtensions;
+using Umbraco.Web.Composing.CompositionExtensions;
using Umbraco.Core.Hosting;
using Umbraco.Core.Mapping;
using Umbraco.Core.Serialization;
diff --git a/src/Umbraco.Core/Compose/AuditEventsComposer.cs b/src/Umbraco.Web/Compose/AuditEventsComposer.cs
similarity index 100%
rename from src/Umbraco.Core/Compose/AuditEventsComposer.cs
rename to src/Umbraco.Web/Compose/AuditEventsComposer.cs
diff --git a/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs b/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs
index 2d32517001..219111fc56 100644
--- a/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs
+++ b/src/Umbraco.Web/Composing/CompositionExtensions/WebMappingProfiles.cs
@@ -1,6 +1,7 @@
using Umbraco.Core;
using Umbraco.Core.Composing;
using Umbraco.Core.Mapping;
+using Umbraco.Web.Models.Identity;
using Umbraco.Web.Models.Mapping;
namespace Umbraco.Web.Composing.CompositionExtensions
@@ -27,7 +28,8 @@ namespace Umbraco.Web.Composing.CompositionExtensions
.Add()
.Add()
.Add()
- .Add();
+ .Add()
+ .Add();;
composition.Register();
composition.Register();
diff --git a/src/Umbraco.Web/Editors/AuthenticationController.cs b/src/Umbraco.Web/Editors/AuthenticationController.cs
index 434fadc716..4249cc09fe 100644
--- a/src/Umbraco.Web/Editors/AuthenticationController.cs
+++ b/src/Umbraco.Web/Editors/AuthenticationController.cs
@@ -27,6 +27,7 @@ using Umbraco.Core.Persistence;
using Umbraco.Web.Composing;
using IUser = Umbraco.Core.Models.Membership.IUser;
using Umbraco.Core.Mapping;
+using Umbraco.Web.Models.Identity;
namespace Umbraco.Web.Editors
{
diff --git a/src/Umbraco.Web/Editors/BackOfficeController.cs b/src/Umbraco.Web/Editors/BackOfficeController.cs
index 4d2f655724..caed09c995 100644
--- a/src/Umbraco.Web/Editors/BackOfficeController.cs
+++ b/src/Umbraco.Web/Editors/BackOfficeController.cs
@@ -23,6 +23,7 @@ using Umbraco.Core.Services;
using Umbraco.Web.Composing;
using Umbraco.Web.Features;
using Umbraco.Web.JavaScript;
+using Umbraco.Web.Models.Identity;
using Umbraco.Web.Security;
using Constants = Umbraco.Core.Constants;
using JArray = Newtonsoft.Json.Linq.JArray;
diff --git a/src/Umbraco.Web/Editors/PasswordChanger.cs b/src/Umbraco.Web/Editors/PasswordChanger.cs
index 6da4e364e1..179ef8fb45 100644
--- a/src/Umbraco.Web/Editors/PasswordChanger.cs
+++ b/src/Umbraco.Web/Editors/PasswordChanger.cs
@@ -7,6 +7,7 @@ using Umbraco.Core.Models;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Security;
using Umbraco.Web.Models;
+using Umbraco.Web.Models.Identity;
using Umbraco.Web.Security;
using IUser = Umbraco.Core.Models.Membership.IUser;
diff --git a/src/Umbraco.Web/Editors/UsersController.cs b/src/Umbraco.Web/Editors/UsersController.cs
index 09590c6d2b..2fc79baa44 100644
--- a/src/Umbraco.Web/Editors/UsersController.cs
+++ b/src/Umbraco.Web/Editors/UsersController.cs
@@ -27,6 +27,7 @@ using Umbraco.Core.Services;
using Umbraco.Core.Strings;
using Umbraco.Web.Editors.Filters;
using Umbraco.Web.Models.ContentEditing;
+using Umbraco.Web.Models.Identity;
using Umbraco.Web.Mvc;
using Umbraco.Web.WebApi;
using Umbraco.Web.WebApi.Filters;
diff --git a/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs b/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs
index 5b5cc39a06..fd29946ba2 100644
--- a/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs
+++ b/src/Umbraco.Web/Install/InstallSteps/NewInstallStep.cs
@@ -12,6 +12,7 @@ using Umbraco.Core.Migrations.Install;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Services;
using Umbraco.Web.Install.Models;
+using Umbraco.Web.Models.Identity;
using Umbraco.Web.Security;
namespace Umbraco.Web.Install.InstallSteps
diff --git a/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs b/src/Umbraco.Web/Models/Identity/BackOfficeIdentityUser.cs
similarity index 99%
rename from src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs
rename to src/Umbraco.Web/Models/Identity/BackOfficeIdentityUser.cs
index 7998e4d69c..8f77de67f2 100644
--- a/src/Umbraco.Core/Models/Identity/BackOfficeIdentityUser.cs
+++ b/src/Umbraco.Web/Models/Identity/BackOfficeIdentityUser.cs
@@ -4,12 +4,14 @@ using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
+using Umbraco.Core;
using Umbraco.Core.Composing;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models.Entities;
+using Umbraco.Core.Models.Identity;
using Umbraco.Core.Models.Membership;
-namespace Umbraco.Core.Models.Identity
+namespace Umbraco.Web.Models.Identity
{
public class BackOfficeIdentityUser : IdentityUser, IdentityUserClaim>, IRememberBeingDirty
{
diff --git a/src/Umbraco.Core/Models/Identity/IdentityMapDefinition.cs b/src/Umbraco.Web/Models/Identity/IdentityMapDefinition.cs
similarity index 97%
rename from src/Umbraco.Core/Models/Identity/IdentityMapDefinition.cs
rename to src/Umbraco.Web/Models/Identity/IdentityMapDefinition.cs
index ef848d545d..7c20c6108a 100644
--- a/src/Umbraco.Core/Models/Identity/IdentityMapDefinition.cs
+++ b/src/Umbraco.Web/Models/Identity/IdentityMapDefinition.cs
@@ -1,10 +1,12 @@
using System;
+using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Mapping;
+using Umbraco.Core.Models;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Services;
-namespace Umbraco.Core.Models.Identity
+namespace Umbraco.Web.Models.Identity
{
public class IdentityMapDefinition : IMapDefinition
{
diff --git a/src/Umbraco.Core/Models/Identity/IdentityUser.cs b/src/Umbraco.Web/Models/Identity/IdentityUser.cs
similarity index 98%
rename from src/Umbraco.Core/Models/Identity/IdentityUser.cs
rename to src/Umbraco.Web/Models/Identity/IdentityUser.cs
index 70f2cee9dd..df104fcafe 100644
--- a/src/Umbraco.Core/Models/Identity/IdentityUser.cs
+++ b/src/Umbraco.Web/Models/Identity/IdentityUser.cs
@@ -1,8 +1,9 @@
using System;
using System.Collections.Generic;
using Microsoft.AspNet.Identity;
+using Umbraco.Core.Models.Identity;
-namespace Umbraco.Core.Models.Identity
+namespace Umbraco.Web.Models.Identity
{
///
/// Default IUser implementation
diff --git a/src/Umbraco.Core/Models/Identity/UserLoginInfoWrapper.cs b/src/Umbraco.Web/Models/Identity/UserLoginInfoWrapper.cs
similarity index 89%
rename from src/Umbraco.Core/Models/Identity/UserLoginInfoWrapper.cs
rename to src/Umbraco.Web/Models/Identity/UserLoginInfoWrapper.cs
index 926d919ca9..cd3cd51d3f 100644
--- a/src/Umbraco.Core/Models/Identity/UserLoginInfoWrapper.cs
+++ b/src/Umbraco.Web/Models/Identity/UserLoginInfoWrapper.cs
@@ -1,6 +1,7 @@
using Microsoft.AspNet.Identity;
+using Umbraco.Core.Models.Identity;
-namespace Umbraco.Core.Models.Identity
+namespace Umbraco.Web.Models.Identity
{
internal class UserLoginInfoWrapper : IUserLoginInfo
{
diff --git a/src/Umbraco.Web/OwinExtensions.cs b/src/Umbraco.Web/OwinExtensions.cs
index 6961f5c915..685868a76b 100644
--- a/src/Umbraco.Web/OwinExtensions.cs
+++ b/src/Umbraco.Web/OwinExtensions.cs
@@ -6,6 +6,7 @@ using Microsoft.Owin.Security;
using Umbraco.Core;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Security;
+using Umbraco.Web.Models.Identity;
using Umbraco.Web.Security;
namespace Umbraco.Web
diff --git a/src/Umbraco.Web/Security/ActiveDirectoryBackOfficeUserPasswordChecker.cs b/src/Umbraco.Web/Security/ActiveDirectoryBackOfficeUserPasswordChecker.cs
index 7f43740fcd..48f171434a 100644
--- a/src/Umbraco.Web/Security/ActiveDirectoryBackOfficeUserPasswordChecker.cs
+++ b/src/Umbraco.Web/Security/ActiveDirectoryBackOfficeUserPasswordChecker.cs
@@ -3,6 +3,7 @@ using System.Configuration;
using System.DirectoryServices.AccountManagement;
using System.Threading.Tasks;
using Umbraco.Core.Models.Identity;
+using Umbraco.Web.Models.Identity;
namespace Umbraco.Web.Security
{
diff --git a/src/Umbraco.Web/Security/AppBuilderExtensions.cs b/src/Umbraco.Web/Security/AppBuilderExtensions.cs
index 3f459cf734..c54de50ba7 100644
--- a/src/Umbraco.Web/Security/AppBuilderExtensions.cs
+++ b/src/Umbraco.Web/Security/AppBuilderExtensions.cs
@@ -20,6 +20,7 @@ using Umbraco.Core.Security;
using Umbraco.Core.Services;
using Umbraco.Net;
using Umbraco.Web.Composing;
+using Umbraco.Web.Models.Identity;
using Constants = Umbraco.Core.Constants;
namespace Umbraco.Web.Security
diff --git a/src/Umbraco.Web/Security/AuthenticationExtensions.cs b/src/Umbraco.Web/Security/AuthenticationExtensions.cs
index e2bbd52a5c..1b89002188 100644
--- a/src/Umbraco.Web/Security/AuthenticationExtensions.cs
+++ b/src/Umbraco.Web/Security/AuthenticationExtensions.cs
@@ -1,6 +1,10 @@
using System;
+using System.Collections.Concurrent;
using System.Collections.Generic;
+using System.Globalization;
+using System.Linq;
using System.Security.Claims;
+using System.Security.Principal;
using System.Threading;
using System.Web;
using Microsoft.AspNet.Identity;
@@ -340,5 +344,57 @@ namespace Umbraco.Web.Security
return secureDataFormat.Unprotect(formsCookie);
}
+
+ ///
+ /// This will return the current back office identity if the IPrincipal is the correct type
+ ///
+ ///
+ ///
+ public static UmbracoBackOfficeIdentity GetUmbracoIdentity(this IPrincipal user)
+ {
+ //If it's already a UmbracoBackOfficeIdentity
+ if (user.Identity is UmbracoBackOfficeIdentity backOfficeIdentity) return backOfficeIdentity;
+
+ //Check if there's more than one identity assigned and see if it's a UmbracoBackOfficeIdentity and use that
+ if (user is ClaimsPrincipal claimsPrincipal)
+ {
+ backOfficeIdentity = claimsPrincipal.Identities.OfType().FirstOrDefault();
+ if (backOfficeIdentity != null) return backOfficeIdentity;
+ }
+
+ //Otherwise convert to a UmbracoBackOfficeIdentity if it's auth'd and has the back office session
+ if (user.Identity is ClaimsIdentity claimsIdentity && claimsIdentity.IsAuthenticated && claimsIdentity.HasClaim(x => x.Type == Constants.Security.SessionIdClaimType))
+ {
+ try
+ {
+ return UmbracoBackOfficeIdentity.FromClaimsIdentity(claimsIdentity);
+ }
+ catch (InvalidOperationException)
+ {
+ }
+ }
+
+ return null;
+ }
+
+ ///
+ /// Ensures that the thread culture is set based on the back office user's culture
+ ///
+ ///
+ public static void EnsureCulture(this IIdentity identity)
+ {
+ if (identity is UmbracoBackOfficeIdentity umbIdentity && umbIdentity.IsAuthenticated)
+ {
+ Thread.CurrentThread.CurrentUICulture =
+ Thread.CurrentThread.CurrentCulture = UserCultures.GetOrAdd(umbIdentity.Culture, s => new CultureInfo(s));
+ }
+ }
+
+
+ ///
+ /// Used so that we aren't creating a new CultureInfo object for every single request
+ ///
+ private static readonly ConcurrentDictionary UserCultures = new ConcurrentDictionary();
+
}
}
diff --git a/src/Umbraco.Web/Security/BackOfficeClaimsIdentityFactory.cs b/src/Umbraco.Web/Security/BackOfficeClaimsIdentityFactory.cs
index e1cdf272d9..487e16539b 100644
--- a/src/Umbraco.Web/Security/BackOfficeClaimsIdentityFactory.cs
+++ b/src/Umbraco.Web/Security/BackOfficeClaimsIdentityFactory.cs
@@ -6,6 +6,7 @@ using Microsoft.AspNet.Identity;
using Umbraco.Core;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Security;
+using Umbraco.Web.Models.Identity;
using Constants = Umbraco.Core.Constants;
namespace Umbraco.Web.Security
diff --git a/src/Umbraco.Web/Security/BackOfficeSignInManager.cs b/src/Umbraco.Web/Security/BackOfficeSignInManager.cs
index 1779f8e257..1440abc13c 100644
--- a/src/Umbraco.Web/Security/BackOfficeSignInManager.cs
+++ b/src/Umbraco.Web/Security/BackOfficeSignInManager.cs
@@ -11,6 +11,7 @@ using Umbraco.Core;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Security;
+using Umbraco.Web.Models.Identity;
using Constants = Umbraco.Core.Constants;
namespace Umbraco.Web.Security
diff --git a/src/Umbraco.Web/Security/BackOfficeUserManager.cs b/src/Umbraco.Web/Security/BackOfficeUserManager.cs
index 688447e52a..6dda5a8b44 100644
--- a/src/Umbraco.Web/Security/BackOfficeUserManager.cs
+++ b/src/Umbraco.Web/Security/BackOfficeUserManager.cs
@@ -12,6 +12,7 @@ using Umbraco.Core.Models.Identity;
using Umbraco.Core.Security;
using Umbraco.Core.Services;
using Umbraco.Net;
+using Umbraco.Web.Models.Identity;
using IPasswordHasher = Microsoft.AspNet.Identity.IPasswordHasher;
namespace Umbraco.Web.Security
diff --git a/src/Umbraco.Web/Security/BackOfficeUserManagerMarker.cs b/src/Umbraco.Web/Security/BackOfficeUserManagerMarker.cs
index 2f5a160198..03477db730 100644
--- a/src/Umbraco.Web/Security/BackOfficeUserManagerMarker.cs
+++ b/src/Umbraco.Web/Security/BackOfficeUserManagerMarker.cs
@@ -3,6 +3,7 @@ using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Security;
+using Umbraco.Web.Models.Identity;
namespace Umbraco.Web.Security
{
diff --git a/src/Umbraco.Core/Security/BackOfficeUserStore.cs b/src/Umbraco.Web/Security/BackOfficeUserStore.cs
similarity index 99%
rename from src/Umbraco.Core/Security/BackOfficeUserStore.cs
rename to src/Umbraco.Web/Security/BackOfficeUserStore.cs
index 5dcc472224..7325f10d8b 100644
--- a/src/Umbraco.Core/Security/BackOfficeUserStore.cs
+++ b/src/Umbraco.Web/Security/BackOfficeUserStore.cs
@@ -10,6 +10,7 @@ using Umbraco.Core.Models;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Models.Membership;
using Umbraco.Core.Services;
+using Umbraco.Web.Models.Identity;
using IUser = Umbraco.Core.Models.Membership.IUser;
using Task = System.Threading.Tasks.Task;
diff --git a/src/Umbraco.Core/Security/BackOfficeUserValidator.cs b/src/Umbraco.Web/Security/BackOfficeUserValidator.cs
similarity index 96%
rename from src/Umbraco.Core/Security/BackOfficeUserValidator.cs
rename to src/Umbraco.Web/Security/BackOfficeUserValidator.cs
index 8f15de2378..0f6b9aa1d4 100644
--- a/src/Umbraco.Core/Security/BackOfficeUserValidator.cs
+++ b/src/Umbraco.Web/Security/BackOfficeUserValidator.cs
@@ -1,6 +1,6 @@
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
-using Umbraco.Core.Models.Identity;
+using Umbraco.Web.Models.Identity;
namespace Umbraco.Core.Security
{
diff --git a/src/Umbraco.Core/Security/ConfiguredPasswordValidator.cs b/src/Umbraco.Web/Security/ConfiguredPasswordValidator.cs
similarity index 100%
rename from src/Umbraco.Core/Security/ConfiguredPasswordValidator.cs
rename to src/Umbraco.Web/Security/ConfiguredPasswordValidator.cs
diff --git a/src/Umbraco.Core/Security/EmailService.cs b/src/Umbraco.Web/Security/EmailService.cs
similarity index 100%
rename from src/Umbraco.Core/Security/EmailService.cs
rename to src/Umbraco.Web/Security/EmailService.cs
diff --git a/src/Umbraco.Web/Security/ExternalSignInAutoLinkOptions.cs b/src/Umbraco.Web/Security/ExternalSignInAutoLinkOptions.cs
index db26127bfb..56773293da 100644
--- a/src/Umbraco.Web/Security/ExternalSignInAutoLinkOptions.cs
+++ b/src/Umbraco.Web/Security/ExternalSignInAutoLinkOptions.cs
@@ -3,6 +3,7 @@ using Microsoft.AspNet.Identity.Owin;
using Umbraco.Core;
using Umbraco.Web.Composing;
using Umbraco.Core.Models.Identity;
+using Umbraco.Web.Models.Identity;
namespace Umbraco.Web.Security
{
diff --git a/src/Umbraco.Web/Security/IBackOfficeUserManagerMarker.cs b/src/Umbraco.Web/Security/IBackOfficeUserManagerMarker.cs
index 53e72ef159..b1f3530879 100644
--- a/src/Umbraco.Web/Security/IBackOfficeUserManagerMarker.cs
+++ b/src/Umbraco.Web/Security/IBackOfficeUserManagerMarker.cs
@@ -1,5 +1,6 @@
using Microsoft.Owin;
using Umbraco.Core.Models.Identity;
+using Umbraco.Web.Models.Identity;
namespace Umbraco.Web.Security
{
diff --git a/src/Umbraco.Web/Security/IBackOfficeUserPasswordChecker.cs b/src/Umbraco.Web/Security/IBackOfficeUserPasswordChecker.cs
index c3ce15b487..9b9e7443be 100644
--- a/src/Umbraco.Web/Security/IBackOfficeUserPasswordChecker.cs
+++ b/src/Umbraco.Web/Security/IBackOfficeUserPasswordChecker.cs
@@ -1,5 +1,6 @@
using System.Threading.Tasks;
using Umbraco.Core.Models.Identity;
+using Umbraco.Web.Models.Identity;
namespace Umbraco.Web.Security
{
diff --git a/src/Umbraco.Core/Security/IUserAwarePasswordHasher.cs b/src/Umbraco.Web/Security/IUserAwarePasswordHasher.cs
similarity index 100%
rename from src/Umbraco.Core/Security/IUserAwarePasswordHasher.cs
rename to src/Umbraco.Web/Security/IUserAwarePasswordHasher.cs
diff --git a/src/Umbraco.Core/Security/IUserSessionStore.cs b/src/Umbraco.Web/Security/IUserSessionStore.cs
similarity index 100%
rename from src/Umbraco.Core/Security/IUserSessionStore.cs
rename to src/Umbraco.Web/Security/IUserSessionStore.cs
diff --git a/src/Umbraco.Core/Security/PasswordSecurity.cs b/src/Umbraco.Web/Security/PasswordSecurity.cs
similarity index 100%
rename from src/Umbraco.Core/Security/PasswordSecurity.cs
rename to src/Umbraco.Web/Security/PasswordSecurity.cs
diff --git a/src/Umbraco.Core/Security/UmbracoBackOfficeIdentity.cs b/src/Umbraco.Web/Security/UmbracoBackOfficeIdentity.cs
similarity index 100%
rename from src/Umbraco.Core/Security/UmbracoBackOfficeIdentity.cs
rename to src/Umbraco.Web/Security/UmbracoBackOfficeIdentity.cs
diff --git a/src/Umbraco.Core/Security/UmbracoEmailMessage.cs b/src/Umbraco.Web/Security/UmbracoEmailMessage.cs
similarity index 100%
rename from src/Umbraco.Core/Security/UmbracoEmailMessage.cs
rename to src/Umbraco.Web/Security/UmbracoEmailMessage.cs
diff --git a/src/Umbraco.Core/Security/UserAwarePasswordHasher.cs b/src/Umbraco.Web/Security/UserAwarePasswordHasher.cs
similarity index 98%
rename from src/Umbraco.Core/Security/UserAwarePasswordHasher.cs
rename to src/Umbraco.Web/Security/UserAwarePasswordHasher.cs
index 66545ab70e..bbfc4905bf 100644
--- a/src/Umbraco.Core/Security/UserAwarePasswordHasher.cs
+++ b/src/Umbraco.Web/Security/UserAwarePasswordHasher.cs
@@ -1,6 +1,6 @@
using System;
using Microsoft.AspNet.Identity;
-using Umbraco.Core.Models.Identity;
+using Umbraco.Web.Models.Identity;
namespace Umbraco.Core.Security
{
diff --git a/src/Umbraco.Web/Security/WebSecurity.cs b/src/Umbraco.Web/Security/WebSecurity.cs
index c4836168dc..cef4c926a4 100644
--- a/src/Umbraco.Web/Security/WebSecurity.cs
+++ b/src/Umbraco.Web/Security/WebSecurity.cs
@@ -10,6 +10,7 @@ using Microsoft.Owin;
using Umbraco.Core.Configuration;
using Umbraco.Core.Models;
using Umbraco.Core.Models.Identity;
+using Umbraco.Web.Models.Identity;
using Current = Umbraco.Web.Composing.Current;
namespace Umbraco.Web.Security
diff --git a/src/Umbraco.Web/Umbraco.Web.csproj b/src/Umbraco.Web/Umbraco.Web.csproj
index bb4df93eb6..feea890438 100755
--- a/src/Umbraco.Web/Umbraco.Web.csproj
+++ b/src/Umbraco.Web/Umbraco.Web.csproj
@@ -138,6 +138,8 @@
+
+
@@ -241,6 +243,10 @@
+
+
+
+
@@ -275,9 +281,19 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/Umbraco.Web/UmbracoInjectedModule.cs b/src/Umbraco.Web/UmbracoInjectedModule.cs
index 110fe4abd8..f8725632ae 100644
--- a/src/Umbraco.Web/UmbracoInjectedModule.cs
+++ b/src/Umbraco.Web/UmbracoInjectedModule.cs
@@ -11,6 +11,7 @@ using Umbraco.Web.Routing;
using Umbraco.Core.Exceptions;
using Umbraco.Core.Security;
using Umbraco.Web.Composing;
+using Umbraco.Web.Security;
namespace Umbraco.Web
{
diff --git a/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs b/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs
index 20419cc99a..c68b949bba 100644
--- a/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs
+++ b/src/Umbraco.Web/WebApi/Filters/CheckIfUserTicketDataIsStaleAttribute.cs
@@ -12,6 +12,7 @@ using Umbraco.Core.Security;
using Umbraco.Web.Security;
using Umbraco.Core.Mapping;
using Umbraco.Core.Models;
+using Umbraco.Web.Models.Identity;
namespace Umbraco.Web.WebApi.Filters
{
diff --git a/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs b/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs
index 97af5e768f..cf9707d40b 100644
--- a/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs
+++ b/src/Umbraco.Web/WebApi/UmbracoAuthorizedApiController.cs
@@ -6,6 +6,7 @@ using Umbraco.Web.WebApi.Filters;
using Umbraco.Core.Models.Identity;
using Umbraco.Core.Persistence;
using Umbraco.Core.Services;
+using Umbraco.Web.Models.Identity;
using Umbraco.Web.Security;
namespace Umbraco.Web.WebApi