From 65782e87c1eff5837bbf1d58636b8402f026dfb0 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Thu, 21 Sep 2023 16:53:52 -0400 Subject: [PATCH] add support for named site options --- ...taneSiteAuthenticationBuilderExtensions.cs | 2 +- .../Extensions/OqtaneSiteOptionsBuilder.cs | 16 +++++++++-- .../Options/ISiteNamedOptions.cs | 11 ++++++++ .../Options/SiteNamedOptions.cs | 28 +++++++++++++++++++ Oqtane.Server/Startup.cs | 12 ++++---- 5 files changed, 60 insertions(+), 9 deletions(-) create mode 100644 Oqtane.Server/Infrastructure/Options/ISiteNamedOptions.cs create mode 100644 Oqtane.Server/Infrastructure/Options/SiteNamedOptions.cs diff --git a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs index f89d8bde..cad695a4 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteAuthenticationBuilderExtensions.cs @@ -28,7 +28,7 @@ namespace Oqtane.Extensions public static OqtaneSiteOptionsBuilder WithSiteAuthentication(this OqtaneSiteOptionsBuilder builder) { // site cookie authentication options - builder.AddSiteOptions((options, alias, sitesettings) => + builder.AddSiteNamedOptions(Constants.AuthenticationScheme, (options, alias, sitesettings) => { options.Cookie.Name = sitesettings.GetValue("LoginOptions:CookieName", ".AspNetCore.Identity.Application"); }); diff --git a/Oqtane.Server/Extensions/OqtaneSiteOptionsBuilder.cs b/Oqtane.Server/Extensions/OqtaneSiteOptionsBuilder.cs index 8f281883..d34cd319 100644 --- a/Oqtane.Server/Extensions/OqtaneSiteOptionsBuilder.cs +++ b/Oqtane.Server/Extensions/OqtaneSiteOptionsBuilder.cs @@ -17,10 +17,22 @@ namespace Microsoft.Extensions.DependencyInjection } public OqtaneSiteOptionsBuilder AddSiteOptions( - Action> action) where TOptions : class, new() + Action> configureOptions) where TOptions : class, new() { Services.TryAddSingleton, SiteOptionsCache>(); - Services.AddSingleton, SiteOptions> (sp => new SiteOptions(action)); + Services.AddSingleton, SiteOptions> (_ => new SiteOptions(configureOptions)); + Services.TryAddTransient, SiteOptionsFactory>(); + Services.TryAddScoped>(sp => BuildOptionsManager(sp)); + Services.TryAddSingleton>(sp => BuildOptionsManager(sp)); + + return this; + } + + public OqtaneSiteOptionsBuilder AddSiteNamedOptions(string name, + Action> configureOptions) where TOptions : class, new() + { + Services.TryAddSingleton, SiteOptionsCache>(); + Services.AddSingleton, SiteNamedOptions>(_ => new SiteNamedOptions(name, configureOptions)); Services.TryAddTransient, SiteOptionsFactory>(); Services.TryAddScoped>(sp => BuildOptionsManager(sp)); Services.TryAddSingleton>(sp => BuildOptionsManager(sp)); diff --git a/Oqtane.Server/Infrastructure/Options/ISiteNamedOptions.cs b/Oqtane.Server/Infrastructure/Options/ISiteNamedOptions.cs new file mode 100644 index 00000000..41ed97c4 --- /dev/null +++ b/Oqtane.Server/Infrastructure/Options/ISiteNamedOptions.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using Oqtane.Models; + +namespace Oqtane.Infrastructure +{ + public interface ISiteNamedOptions + where TOptions : class, new() + { + void Configure(string name, TOptions options, Alias alias, Dictionary sitesettings); + } +} diff --git a/Oqtane.Server/Infrastructure/Options/SiteNamedOptions.cs b/Oqtane.Server/Infrastructure/Options/SiteNamedOptions.cs new file mode 100644 index 00000000..1027cc54 --- /dev/null +++ b/Oqtane.Server/Infrastructure/Options/SiteNamedOptions.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using Oqtane.Models; + +namespace Oqtane.Infrastructure +{ + public class SiteNamedOptions : ISiteNamedOptions + where TOptions : class, new() + { + public string Name { get; } + + private readonly Action> configureOptions; + + public SiteNamedOptions(string name, Action> configureOptions) + { + Name = name; + this.configureOptions = configureOptions; + } + + public void Configure(string name, TOptions options, Alias alias, Dictionary sitesettings) + { + if (name == Name) + { + configureOptions(options, alias, sitesettings); + } + } + } +} diff --git a/Oqtane.Server/Startup.cs b/Oqtane.Server/Startup.cs index 8277c378..8d8026d6 100644 --- a/Oqtane.Server/Startup.cs +++ b/Oqtane.Server/Startup.cs @@ -114,12 +114,12 @@ namespace Oqtane services.ConfigureOqtaneIdentityOptions(Configuration); services.AddAuthentication(options => - { - options.DefaultScheme = Constants.AuthenticationScheme; - }) - .AddCookie(Constants.AuthenticationScheme) - .AddOpenIdConnect(AuthenticationProviderTypes.OpenIDConnect, options => { }) - .AddOAuth(AuthenticationProviderTypes.OAuth2, options => { }); + { + options.DefaultScheme = Constants.AuthenticationScheme; + }) + .AddCookie(Constants.AuthenticationScheme) + .AddOpenIdConnect(AuthenticationProviderTypes.OpenIDConnect, options => { }) + .AddOAuth(AuthenticationProviderTypes.OAuth2, options => { }); services.ConfigureOqtaneCookieOptions(); services.ConfigureOqtaneAuthenticationOptions(Configuration);