diff --git a/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj b/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj
index e36e1c739..c77f5307c 100644
--- a/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj
+++ b/backend/extensions/Squidex.Extensions/Squidex.Extensions.csproj
@@ -8,16 +8,16 @@
-
+
-
+
-
-
+
+
-
+
diff --git a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs
index 9dc3c01df..6cdf281f6 100644
--- a/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs
+++ b/backend/src/Squidex.Domain.Apps.Core.Model/Contents/GeoJsonValue.cs
@@ -12,7 +12,6 @@ using Squidex.Infrastructure.Json;
using Squidex.Infrastructure.Json.Objects;
using Squidex.Infrastructure.ObjectPool;
using Squidex.Infrastructure.Validation;
-using System.IO;
namespace Squidex.Domain.Apps.Core.Contents
{
diff --git a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj
index 0eb68127b..34764e618 100644
--- a/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj
+++ b/backend/src/Squidex.Domain.Apps.Core.Operations/Squidex.Domain.Apps.Core.Operations.csproj
@@ -18,11 +18,11 @@
-
-
+
+
-
-
+
+
diff --git a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj
index 8af1e445c..cc50ada9c 100644
--- a/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj
+++ b/backend/src/Squidex.Domain.Apps.Entities.MongoDb/Squidex.Domain.Apps.Entities.MongoDb.csproj
@@ -17,7 +17,7 @@
-
+
diff --git a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj
index 9a863a553..2fbd973b3 100644
--- a/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj
+++ b/backend/src/Squidex.Domain.Apps.Entities/Squidex.Domain.Apps.Entities.csproj
@@ -17,21 +17,21 @@
-
-
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
-
+
+
-
+
all
runtime; build; native; contentfiles; analyzers
-
+
diff --git a/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj b/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj
index 7027871a3..bfd397200 100644
--- a/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj
+++ b/backend/src/Squidex.Domain.Users.MongoDb/Squidex.Domain.Users.MongoDb.csproj
@@ -19,7 +19,7 @@
-
+
diff --git a/backend/src/Squidex.Domain.Users/PwnedPasswordValidator.cs b/backend/src/Squidex.Domain.Users/PwnedPasswordValidator.cs
deleted file mode 100644
index d68a302a2..000000000
--- a/backend/src/Squidex.Domain.Users/PwnedPasswordValidator.cs
+++ /dev/null
@@ -1,55 +0,0 @@
-// ==========================================================================
-// Squidex Headless CMS
-// ==========================================================================
-// Copyright (c) Squidex UG (haftungsbeschraenkt)
-// All rights reserved. Licensed under the MIT license.
-// ==========================================================================
-
-using System;
-using System.Threading.Tasks;
-using Microsoft.AspNetCore.Identity;
-using SharpPwned.NET;
-using Squidex.Infrastructure.Translations;
-using Squidex.Log;
-
-namespace Squidex.Domain.Users
-{
- public sealed class PwnedPasswordValidator : IPasswordValidator
- {
- private readonly HaveIBeenPwnedRestClient client = new HaveIBeenPwnedRestClient();
- private readonly ISemanticLog log;
-
- public PwnedPasswordValidator(ISemanticLog log)
- {
- this.log = log;
- }
-
- public async Task ValidateAsync(UserManager manager, IdentityUser user, string password)
- {
- if (string.IsNullOrWhiteSpace(password))
- {
- return IdentityResult.Success;
- }
-
- try
- {
- var isBreached = await client.IsPasswordPwned(password);
-
- if (isBreached)
- {
- var errorText = T.Get("security.passwordStolen");
-
- return IdentityResult.Failed(new IdentityError { Code = "PwnedError", Description = errorText });
- }
- }
- catch (Exception ex)
- {
- log.LogError(ex, w => w
- .WriteProperty("operation", "CheckPasswordPwned")
- .WriteProperty("status", "Failed"));
- }
-
- return IdentityResult.Success;
- }
- }
-}
diff --git a/backend/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj b/backend/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj
index 173b054b3..976c9b9f9 100644
--- a/backend/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj
+++ b/backend/src/Squidex.Domain.Users/Squidex.Domain.Users.csproj
@@ -17,11 +17,11 @@
-
+
-
+
-
+
diff --git a/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj b/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj
index 3e502c1b4..ba8b59a5a 100644
--- a/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj
+++ b/backend/src/Squidex.Infrastructure.MongoDb/Squidex.Infrastructure.MongoDb.csproj
@@ -13,8 +13,8 @@
-
-
+
+
diff --git a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj
index f893792ec..021c05401 100644
--- a/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj
+++ b/backend/src/Squidex.Infrastructure/Squidex.Infrastructure.csproj
@@ -10,22 +10,22 @@
-
-
+
+
-
+
-
-
+
+
all
runtime; build; native; contentfiles; analyzers
-
-
+
+
-
+
-
+
diff --git a/backend/src/Squidex.Web/Squidex.Web.csproj b/backend/src/Squidex.Web/Squidex.Web.csproj
index 76db03243..5ae80b254 100644
--- a/backend/src/Squidex.Web/Squidex.Web.csproj
+++ b/backend/src/Squidex.Web/Squidex.Web.csproj
@@ -16,7 +16,7 @@
all
runtime; build; native; contentfiles; analyzers; buildtransitive
-
+
diff --git a/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs b/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs
index 802725fa2..f3c1b861d 100644
--- a/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs
+++ b/backend/src/Squidex/Areas/IdentityServer/Config/IdentityServerServices.cs
@@ -43,9 +43,6 @@ namespace Squidex.Areas.IdentityServer.Config
services.AddSingletonAs()
.As();
- services.AddSingletonAs()
- .As>();
-
services.AddScopedAs()
.As();
diff --git a/backend/src/Squidex/Squidex.csproj b/backend/src/Squidex/Squidex.csproj
index 34d901a8e..1fe924541 100644
--- a/backend/src/Squidex/Squidex.csproj
+++ b/backend/src/Squidex/Squidex.csproj
@@ -32,41 +32,41 @@
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
+
-
+
diff --git a/backend/src/Squidex/appsettings.json b/backend/src/Squidex/appsettings.json
index 7cba5a000..25ae5f1b6 100644
--- a/backend/src/Squidex/appsettings.json
+++ b/backend/src/Squidex/appsettings.json
@@ -323,7 +323,14 @@
/*
* The timeout when searching for multiple items in the database.
*/
- "timeoutQuery": "00:00:05"
+ "timeoutQuery": "00:00:05",
+
+ /*
+ * Create one folder per app.
+ *
+ * WARNING: If you change this parameter, previous assets are not available anymore.
+ */
+ "folderPerApp": false
},
"logging": {
diff --git a/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj b/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj
index e8cc7c00e..2df80508e 100644
--- a/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj
+++ b/backend/tests/Squidex.Domain.Apps.Core.Tests/Squidex.Domain.Apps.Core.Tests.csproj
@@ -12,11 +12,11 @@
-
+
-
+
diff --git a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj
index cf4ab61d4..5479a3985 100644
--- a/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj
+++ b/backend/tests/Squidex.Domain.Apps.Entities.Tests/Squidex.Domain.Apps.Entities.Tests.csproj
@@ -17,15 +17,15 @@
-
+
-
-
+
+
-
-
+
+
diff --git a/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj b/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj
index ff20815dd..5982d4cf6 100644
--- a/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj
+++ b/backend/tests/Squidex.Domain.Users.Tests/Squidex.Domain.Users.Tests.csproj
@@ -13,9 +13,9 @@
-
+
-
+
diff --git a/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj b/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj
index 6eeb6a867..a6d9075c5 100644
--- a/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj
+++ b/backend/tests/Squidex.Infrastructure.Tests/Squidex.Infrastructure.Tests.csproj
@@ -12,13 +12,13 @@
-
+
-
+
-
-
-
+
+
+
all
runtime; build; native; contentfiles; analyzers
diff --git a/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj b/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj
index 5c22a977a..7b11adf67 100644
--- a/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj
+++ b/backend/tests/Squidex.Web.Tests/Squidex.Web.Tests.csproj
@@ -11,10 +11,10 @@
-
+
-
+