From 83772043e67950277fd1442eb51e9a01479bdcac Mon Sep 17 00:00:00 2001 From: Tobias Klika Date: Fri, 9 Dec 2022 12:24:43 +0100 Subject: [PATCH] reorganize architecture items --- zero.Raven/Identity/RavenRoleStore(TRole).cs | 3 +- zero.Raven/Identity/RavenUserStore(TUser).cs | 3 +- .../Identity/RavenUserStore(TUser,TRole).cs | 3 +- .../Identity/ServiceCollectionExtensions.cs | 94 +++++++++++++++++++ zero.Raven/Usings.cs | 2 +- .../AssemblyDiscovery.cs | 2 +- .../AssemblyDiscoveryContext.cs | 2 +- .../IAssemblyDiscoveryRule.cs | 2 +- .../ZeroAssemblyDiscoveryRule.cs | 6 +- zero/{Architecture => Modules}/ZeroModule.cs | 2 +- .../ZeroModuleCollection.cs | 2 +- zero/Usings.cs | 5 +- 12 files changed, 112 insertions(+), 14 deletions(-) create mode 100644 zero.Raven/Identity/ServiceCollectionExtensions.cs rename zero/{Architecture/AssemblyDiscovery => Assemblies}/AssemblyDiscovery.cs (99%) rename zero/{Architecture/AssemblyDiscovery => Assemblies}/AssemblyDiscoveryContext.cs (94%) rename zero/{Architecture/AssemblyDiscovery => Assemblies}/IAssemblyDiscoveryRule.cs (91%) rename zero/{Architecture/AssemblyDiscovery => Assemblies}/ZeroAssemblyDiscoveryRule.cs (65%) rename zero/{Architecture => Modules}/ZeroModule.cs (98%) rename zero/{Architecture => Modules}/ZeroModuleCollection.cs (98%) diff --git a/zero.Raven/Identity/RavenRoleStore(TRole).cs b/zero.Raven/Identity/RavenRoleStore(TRole).cs index 4faa8b26..771a1276 100644 --- a/zero.Raven/Identity/RavenRoleStore(TRole).cs +++ b/zero.Raven/Identity/RavenRoleStore(TRole).cs @@ -4,9 +4,10 @@ using Raven.Client.Documents.Linq; using Raven.Client.Exceptions; using System.Security.Claims; using Microsoft.AspNetCore.Mvc.ApplicationModels; +using zero.Identity; using zero.Raven; -namespace zero.Identity; +namespace zero.Raven; public class RavenRoleStore : IRoleStore, diff --git a/zero.Raven/Identity/RavenUserStore(TUser).cs b/zero.Raven/Identity/RavenUserStore(TUser).cs index 9c27a825..d9e0172f 100644 --- a/zero.Raven/Identity/RavenUserStore(TUser).cs +++ b/zero.Raven/Identity/RavenUserStore(TUser).cs @@ -5,9 +5,10 @@ using Raven.Client.Documents.Linq; using System.Security.Claims; using System.Security.Cryptography; using Raven.Client.Exceptions; +using zero.Identity; using zero.Raven; -namespace zero.Identity; +namespace zero.Raven; public partial class RavenUserStore : diff --git a/zero.Raven/Identity/RavenUserStore(TUser,TRole).cs b/zero.Raven/Identity/RavenUserStore(TUser,TRole).cs index 9aaaa1f9..a7c695ee 100644 --- a/zero.Raven/Identity/RavenUserStore(TUser,TRole).cs +++ b/zero.Raven/Identity/RavenUserStore(TUser,TRole).cs @@ -1,9 +1,10 @@ using Microsoft.AspNetCore.Identity; using Raven.Client.Documents; using Raven.Client.Documents.Linq; +using zero.Identity; using zero.Raven; -namespace zero.Identity; +namespace zero.Raven; public partial class RavenUserStore : RavenUserStore, IUserRoleStore diff --git a/zero.Raven/Identity/ServiceCollectionExtensions.cs b/zero.Raven/Identity/ServiceCollectionExtensions.cs new file mode 100644 index 00000000..36dc18e0 --- /dev/null +++ b/zero.Raven/Identity/ServiceCollectionExtensions.cs @@ -0,0 +1,94 @@ +using Microsoft.AspNetCore.Authentication.Cookies; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Identity; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; +using zero.Identity; + +namespace zero.Raven; + +public static class ServiceCollectionExtensions +{ + /// + /// Adds the default identity system configuration for the specified User and Role types, using RavenDB as the data store. + /// + public static IdentityBuilder AddRavenDbIdentity( + this IServiceCollection services) + where TUser : ZeroIdentityUser, new() + where TRole : ZeroIdentityRole, new() + => services.AddIdentity(setupAction: null!); + + /// + /// Adds and configures the identity system for the specified User and Role types, using RavenDB as the data store. + /// + public static IdentityBuilder AddRavenDbIdentity( + this IServiceCollection services, + Action setupAction + ) + where TUser : ZeroIdentityUser, new() + where TRole : ZeroIdentityRole, new() + { + // Services used by identity + services.AddAuthentication(options => + { + options.DefaultAuthenticateScheme = IdentityConstants.ApplicationScheme; + options.DefaultChallengeScheme = IdentityConstants.ApplicationScheme; + options.DefaultSignInScheme = IdentityConstants.ExternalScheme; + }) + .AddCookie(IdentityConstants.ApplicationScheme, o => + { + o.LoginPath = new PathString("/Account/Login"); + o.Events = new CookieAuthenticationEvents + { + OnValidatePrincipal = SecurityStampValidator.ValidatePrincipalAsync + }; + }) + .AddCookie(IdentityConstants.ExternalScheme, o => + { + o.Cookie.Name = IdentityConstants.ExternalScheme; + o.ExpireTimeSpan = TimeSpan.FromMinutes(5); + }) + .AddCookie(IdentityConstants.TwoFactorRememberMeScheme, o => + { + o.Cookie.Name = IdentityConstants.TwoFactorRememberMeScheme; + o.Events = new CookieAuthenticationEvents + { + OnValidatePrincipal = SecurityStampValidator.ValidateAsync + }; + }) + .AddCookie(IdentityConstants.TwoFactorUserIdScheme, o => + { + o.Cookie.Name = IdentityConstants.TwoFactorUserIdScheme; + o.ExpireTimeSpan = TimeSpan.FromMinutes(5); + }); + + // Hosting doesn't add IHttpContextAccessor by default + services.AddHttpContextAccessor(); + + // Data stores + services.TryAddScoped, RavenUserStore>(); + services.TryAddScoped, RavenRoleStore>(); + + // Identity services + services.TryAddScoped, UserValidator>(); + services.TryAddScoped, PasswordValidator>(); + services.TryAddScoped, PasswordHasher>(); + services.TryAddScoped(); + services.TryAddScoped, RoleValidator>(); + services.TryAddScoped(); + services.TryAddScoped>(); + services.TryAddScoped>(); + services.TryAddScoped, UserClaimsPrincipalFactory>(); + services.TryAddScoped, DefaultUserConfirmation>(); + services.TryAddScoped>(); + services.TryAddScoped>(); + services.TryAddScoped>(); + + if (setupAction != null) + { + services.Configure(setupAction); + } + + return new IdentityBuilder(typeof(TUser), typeof(TRole), services); + } +} \ No newline at end of file diff --git a/zero.Raven/Usings.cs b/zero.Raven/Usings.cs index 58742184..b2a82ab9 100644 --- a/zero.Raven/Usings.cs +++ b/zero.Raven/Usings.cs @@ -11,7 +11,7 @@ global using zero.Configuration; global using zero.Extensions; global using zero.FileStorage; global using zero.Models; -global using zero.Architecture; +global using zero.Modules; global using zero.Rendering; global using zero.Validation; global using zero.Localization; diff --git a/zero/Architecture/AssemblyDiscovery/AssemblyDiscovery.cs b/zero/Assemblies/AssemblyDiscovery.cs similarity index 99% rename from zero/Architecture/AssemblyDiscovery/AssemblyDiscovery.cs rename to zero/Assemblies/AssemblyDiscovery.cs index c1ffceaf..a7914a29 100644 --- a/zero/Architecture/AssemblyDiscovery/AssemblyDiscovery.cs +++ b/zero/Assemblies/AssemblyDiscovery.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyModel; using System.Reflection; -namespace zero.Architecture; +namespace zero.Assemblies; public class AssemblyDiscovery : IAssemblyDiscovery { diff --git a/zero/Architecture/AssemblyDiscovery/AssemblyDiscoveryContext.cs b/zero/Assemblies/AssemblyDiscoveryContext.cs similarity index 94% rename from zero/Architecture/AssemblyDiscovery/AssemblyDiscoveryContext.cs rename to zero/Assemblies/AssemblyDiscoveryContext.cs index 33cd0836..0e6c0dd4 100644 --- a/zero/Architecture/AssemblyDiscovery/AssemblyDiscoveryContext.cs +++ b/zero/Assemblies/AssemblyDiscoveryContext.cs @@ -1,6 +1,6 @@ using System.Reflection; -namespace zero.Architecture; +namespace zero.Assemblies; public class AssemblyDiscoveryContext { diff --git a/zero/Architecture/AssemblyDiscovery/IAssemblyDiscoveryRule.cs b/zero/Assemblies/IAssemblyDiscoveryRule.cs similarity index 91% rename from zero/Architecture/AssemblyDiscovery/IAssemblyDiscoveryRule.cs rename to zero/Assemblies/IAssemblyDiscoveryRule.cs index d2f4a5ab..f2b80baf 100644 --- a/zero/Architecture/AssemblyDiscovery/IAssemblyDiscoveryRule.cs +++ b/zero/Assemblies/IAssemblyDiscoveryRule.cs @@ -1,6 +1,6 @@ using Microsoft.Extensions.DependencyModel; -namespace zero.Architecture; +namespace zero.Assemblies; public interface IAssemblyDiscoveryRule { diff --git a/zero/Architecture/AssemblyDiscovery/ZeroAssemblyDiscoveryRule.cs b/zero/Assemblies/ZeroAssemblyDiscoveryRule.cs similarity index 65% rename from zero/Architecture/AssemblyDiscovery/ZeroAssemblyDiscoveryRule.cs rename to zero/Assemblies/ZeroAssemblyDiscoveryRule.cs index be1f7ff7..cdbfa41b 100644 --- a/zero/Architecture/AssemblyDiscovery/ZeroAssemblyDiscoveryRule.cs +++ b/zero/Assemblies/ZeroAssemblyDiscoveryRule.cs @@ -1,16 +1,16 @@ using Microsoft.Extensions.DependencyModel; -namespace zero.Architecture; +namespace zero.Assemblies; public class ZeroAssemblyDiscoveryRule : IAssemblyDiscoveryRule { - const string ZERO_PREFIX = "zero."; + const string ZeroPrefix = "zero."; /// public bool IsValid(RuntimeLibrary library, AssemblyDiscoveryContext context) { StringComparison casing = StringComparison.OrdinalIgnoreCase; // TODO we need to auto-add assemblies and discover their types which have implementations of IZeroPlugin - return library.Name.StartsWith(ZERO_PREFIX, casing) || (context.HasEntryAssembly && library.Name.Contains(context.EntryAssemblyName, casing)); + return library.Name.StartsWith(ZeroPrefix, casing) || (context.HasEntryAssembly && library.Name.Contains(context.EntryAssemblyName, casing)); } } \ No newline at end of file diff --git a/zero/Architecture/ZeroModule.cs b/zero/Modules/ZeroModule.cs similarity index 98% rename from zero/Architecture/ZeroModule.cs rename to zero/Modules/ZeroModule.cs index 959cdea8..b1303e0f 100644 --- a/zero/Architecture/ZeroModule.cs +++ b/zero/Modules/ZeroModule.cs @@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -namespace zero.Architecture; +namespace zero.Modules; public abstract class ZeroModule : IZeroModule { diff --git a/zero/Architecture/ZeroModuleCollection.cs b/zero/Modules/ZeroModuleCollection.cs similarity index 98% rename from zero/Architecture/ZeroModuleCollection.cs rename to zero/Modules/ZeroModuleCollection.cs index 8ae3278b..571b15b6 100644 --- a/zero/Architecture/ZeroModuleCollection.cs +++ b/zero/Modules/ZeroModuleCollection.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using System.Collections.Concurrent; -namespace zero.Architecture; +namespace zero.Modules; public class ZeroModuleCollection : ZeroModule { diff --git a/zero/Usings.cs b/zero/Usings.cs index c647c926..80fffe84 100644 --- a/zero/Usings.cs +++ b/zero/Usings.cs @@ -12,9 +12,10 @@ global using zero.Configuration; global using zero.Extensions; global using zero.FileStorage; global using zero.Models; -global using zero.Architecture; +global using zero.Modules; global using zero.Rendering; global using zero.Validation; global using zero.Localization; global using zero.Context; -global using zero.Communication; \ No newline at end of file +global using zero.Communication; +global using zero.Assemblies; \ No newline at end of file