elsa-workflows / elsa-workflows/elsa-core
Admin user cannot create roles/users for newly created tenants due to tenant resolution failing
- Dominant language
- C#
- Stars
- 7.9k
- Forks
- 1.5k
- Avg merge
- 15h 22m
- Merged PRs (30d)
- 114
Description
## The Problem
I'm implementing a multi-tenant system where an admin user (AdminUserProvider) needs to:
1. Create a new tenant
2. Create roles and users for that tenant (using `X-Tenant-ID` header to switch context)
However, when I set the `X-Tenant-ID` header to target a newly created tenant, the tenant resolution fails and returns `null`.
## Root Cause
- tenantsProvider.ListAsync() is filtered by the global query filter (WHERE TenantId = current OR TenantId = '*')
```csharp
public class SetTenantIdFilter : IEntityModelCreatingHandler
{
///
public void Handle(ElsaDbContextBase dbContext, ModelBuilder modelBuilder, IMutableEntityType entityType)
{
if (!typeof(Entity).IsAssignableFrom(entityType.ClrType))
return;
modelBuilder
.Entity(entityType.ClrType)
.HasQueryFilter(CreateTenantFilterExpression(dbContext, entityType.ClrType));
}
private LambdaExpression CreateTenantFilterExpression(ElsaDbContextBase dbContext, Type clrType)
{
var parameter = Expression.Parameter(clrType, "e");
// e => EF.Property(e, "TenantId") == this.TenantId || EF.Property(e, "TenantId") == "*"
var tenantIdProperty = Expression.Call(
typeof(EF),
nameof(EF.Property),
[typeof(string)],
parameter,
Expression.Constant("TenantId"));
var tenantIdOnContext = Expression.Property(
Expression.Constant(dbContext),
nameof(ElsaDbContextBase.TenantId));
var equalityCheck = Expression.Equal(tenantIdProperty, tenantIdOnContext);
var agnosticCheck = Expression.Equal(tenantIdProperty, Expression.Constant(Tenant.AgnosticTenantId, typeof(string)));
var body = Expression.OrElse(equalityCheck, agnosticCheck);
return Expression.Lambda(body, parameter);
}
}
```
What is the recommended approach for this scenario in Elsa Core ?
Contributor guide
Assessment
This issue has not been assessed yet.