diff --git a/src/apps/Elsa.Server.Web/Program.cs b/src/apps/Elsa.Server.Web/Program.cs index e22f276fd..32fdbfc5c 100644 --- a/src/apps/Elsa.Server.Web/Program.cs +++ b/src/apps/Elsa.Server.Web/Program.cs @@ -659,7 +659,11 @@ services } }); - elsa.UseTenantHttpRouting(); + elsa.UseTenantHttpRouting(tenantHttpRouting => + { + // Override the tenant header name with a custom one. + tenantHttpRouting.WithTenantHeader("X-Company-Id"); + }); } elsa.InstallDropIns(options => options.DropInRootDirectory = Path.Combine(Directory.GetCurrentDirectory(), "App_Data", "DropIns")); diff --git a/src/modules/Elsa.Tenants.AspNetCore/Features/MultitenantHttpRoutingFeature.cs b/src/modules/Elsa.Tenants.AspNetCore/Features/MultitenantHttpRoutingFeature.cs index 2def1e4d6..bdf0df3b8 100644 --- a/src/modules/Elsa.Tenants.AspNetCore/Features/MultitenantHttpRoutingFeature.cs +++ b/src/modules/Elsa.Tenants.AspNetCore/Features/MultitenantHttpRoutingFeature.cs @@ -3,6 +3,7 @@ using Elsa.Features.Abstractions; using Elsa.Features.Attributes; using Elsa.Features.Services; using Elsa.Http.Features; +using Elsa.Tenants.AspNetCore.Options; using Elsa.Tenants.AspNetCore.Services; using Elsa.Tenants.Features; using Microsoft.Extensions.DependencyInjection; @@ -13,6 +14,26 @@ namespace Elsa.Tenants.AspNetCore.Features; [DependencyOf(typeof(TenantsFeature))] public class MultitenantHttpRoutingFeature(IModule module) : FeatureBase(module) { + private Action _configureMultitenancyHttpOptions = _ => { }; + + /// + /// Configures the MultitenantHttpRoutingFeature to use a specific tenant header name. + /// + /// The name of the HTTP header used to identify the tenant. + /// The current instance of for fluent configuration. + public MultitenantHttpRoutingFeature WithTenantHeader(string headerName) => WithMultitenancyHttpOptions(options => options.TenantHeaderName = headerName); + + /// + /// Configures the MultitenantHttpRoutingFeature with custom multitenancy HTTP options. + /// + /// The action to configure . + /// The current instance of for fluent configuration. + public MultitenantHttpRoutingFeature WithMultitenancyHttpOptions(Action configure) + { + _configureMultitenancyHttpOptions = configure; + return this; + } + public override void Configure() { Module.Configure(feature => @@ -24,6 +45,9 @@ public class MultitenantHttpRoutingFeature(IModule module) : FeatureBase(module) public override void Apply() { + // Multitenancy HTTP options. + Services.Configure(_configureMultitenancyHttpOptions); + // Tenant resolvers. Services .AddScoped() diff --git a/src/modules/Elsa.Tenants.AspNetCore/Options/MultitenancyHttpOptions.cs b/src/modules/Elsa.Tenants.AspNetCore/Options/MultitenancyHttpOptions.cs new file mode 100644 index 000000000..877400eb6 --- /dev/null +++ b/src/modules/Elsa.Tenants.AspNetCore/Options/MultitenancyHttpOptions.cs @@ -0,0 +1,6 @@ +namespace Elsa.Tenants.AspNetCore.Options; + +public class MultitenancyHttpOptions +{ + public string TenantHeaderName { get; set; } = "X-Tenant-Id"; +} \ No newline at end of file diff --git a/src/modules/Elsa.Tenants.AspNetCore/Resolvers/HeaderTenantResolver.cs b/src/modules/Elsa.Tenants.AspNetCore/Resolvers/HeaderTenantResolver.cs index 06d36e387..697049285 100644 --- a/src/modules/Elsa.Tenants.AspNetCore/Resolvers/HeaderTenantResolver.cs +++ b/src/modules/Elsa.Tenants.AspNetCore/Resolvers/HeaderTenantResolver.cs @@ -1,12 +1,14 @@ using Elsa.Common.Multitenancy; +using Elsa.Tenants.AspNetCore.Options; using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Options; namespace Elsa.Tenants.AspNetCore; /// /// Resolves the tenant based on the header in the request. /// -public class HeaderTenantResolver(IHttpContextAccessor httpContextAccessor) : TenantResolverBase +public class HeaderTenantResolver(IHttpContextAccessor httpContextAccessor, IOptions options) : TenantResolverBase { protected override TenantResolverResult Resolve(TenantResolverContext context) { @@ -15,7 +17,8 @@ public class HeaderTenantResolver(IHttpContextAccessor httpContextAccessor) : Te if (httpContext == null) return Unresolved(); - var tenantId = httpContext.Request.Headers["X-Tenant-Id"].FirstOrDefault(); + var headerName = options.Value.TenantHeaderName; + var tenantId = httpContext.Request.Headers[headerName].FirstOrDefault(); return AutoResolve(tenantId); }