Kephas.Tenants
11.1.0
Prefix Reserved
dotnet add package Kephas.Tenants --version 11.1.0
NuGet\Install-Package Kephas.Tenants -Version 11.1.0
<PackageReference Include="Kephas.Tenants" Version="11.1.0" />
paket add Kephas.Tenants --version 11.1.0
#r "nuget: Kephas.Tenants, 11.1.0"
// Install Kephas.Tenants as a Cake Addin #addin nuget:?package=Kephas.Tenants&version=11.1.0 // Install Kephas.Tenants as a Cake Tool #tool nuget:?package=Kephas.Tenants&version=11.1.0
Tenants
Introduction
This package adds support for multi-tenant applications.
How it works:
- Include the
Kephas.Tenants
package in the application deployment. - The application receives the tenant identifier through the
tenant
command line argument or theKEPHASAPP_Tenant
environment variable. - The tenant is available in code through
IAppArgs.Tenant()
extension method or theIContext.Tenant()
extension method.- Note that
IAppArgs
are available through dependency injection andIContext
instances through the parameter received in context dependent invocations.
- Note that
- When setting up the
IAmbientServices
during application bootstrapping, make sure to invoke theambientServices.WithTenantSupoport()
.- Do this typically before setting up the application runtime (for example
WithStaticAppRuntime
,WithDynamicAppRuntime
, orWithPluginsAppRuntime
), to make sure the runtime accesses the correct locations.
- Do this typically before setting up the application runtime (for example
What is the immediate effect:
- Tenant administrative mode
- When the application was started without a tenant identifier specified either in command line arguments or in the environment variables. This mode should allow tenant management actions.
- The folder locations are not changed.
- Tenant specific mode
- The tenant identifier is passed to the running application.
- The folder locations (config, licenses, plugins) are found in the
{tenant}
subdirectory of the original folder locations.
Check the following packages for more information:
Example
public static IAmbientServices SetupAmbientServices(
this IAmbientServices ambientServices,
Func<IAmbientServices, IEncryptionService> encryptionServiceFactory,
IConfiguration? configuration,
IAppArgs appArgs)
{
return ambientServices
.WithDefaultLicensingManager(encryptionServiceFactory(ambientServices))
// Do not forget setting up the tenant support right *after* setting up the application runtime.
.WithTenantSupport(appArgs)
//
.WithDynamicAppRuntime()
.WithSerilogManager(configuration);
}
Security
Tenants management
A global scope tenantsmanagement
permission is provided to require in endpoints or other application actions affecting overall tenants management.
Tenant admin
A global scope tenantadmin
permission is provided to require in endpoints or other application actions affecting management of the tenant.
Example
/// <summary>
/// Endpoint message for adding a tenant.
/// </summary>
[RequiresPermission(typeof(TenantsManagementPermission))]
public class AddTenantMessage : IMessage
{
//...
}
/// <summary>
/// Endpoint message for changing the tenant information.
/// </summary>
[RequiresPermission(typeof(TenantAdminPermission))]
public class ChangeTenantInfoMessage : IMessage
{
//...
}
Configuration
Tenant specific
The TenantSettings
are available through the injectable IConfiguration<TenantSettings>
service. It provides:
- DisplayName (string): The tenant's display name.
- Domains (string[]): an array of domain owned by the tenant. These domains are typically used in the authorization process to identify the tenant a user belongs to.
Example
var config = injector.Resolve<IConfiguration<TenantSettings>>();
var settings = config.GetSettings(context);
settings.DisplayName = "My changed name";
await config.UpdateSettingsAsync(settings, context).PreserveThreadingContext();
Tenant management
The TenantsManagementSettings
are available through the injectable IConfiguration<TenantsManagementSettings>
service. It provides:
- GlobalAdmin (GlobalAdminSettings): settings for the global tenants administrator.
- Tenants (TenantSettings[]): list of settings for the application tenants.
IO
By default, the AmbientServices registers the FolderLocationsManager
implementation for the service ILocationsManager
.
This normalizes the paths and resolves them relative to the application location. Instead, by using IAmbientServices.WithTenantSupport()
,
this global service is replaced with TenantFolderLocationsManager
which appends the tenant identifier prefixed by dot (.) to each of the folders.
This has the following effects:
- The configuration, licenses, plugins, and other locations dependent on the
ILocationsManager
service will return different locations for different tenants. - By prefixing the tenant path element with dot (.), this location is considered hidden by other services and, therefore ignored (checked with
location.IsHiddenLocation()
extension method).
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. |
.NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.1 is compatible. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETStandard 2.1
- Kephas.Abstractions (>= 11.1.0)
- Kephas.Configuration (>= 11.1.0)
- Kephas.Security (>= 11.1.0)
-
net6.0
- Kephas.Abstractions (>= 11.1.0)
- Kephas.Configuration (>= 11.1.0)
- Kephas.Security (>= 11.1.0)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated |
---|---|---|
11.1.0 | 468 | 4/13/2022 |
11.1.0-dev.4 | 135 | 4/6/2022 |
11.1.0-dev.3 | 116 | 3/30/2022 |
11.1.0-dev.2 | 128 | 3/23/2022 |
11.1.0-dev.1 | 114 | 3/23/2022 |
11.0.0 | 464 | 3/11/2022 |
11.0.0-dev.7 | 126 | 3/7/2022 |
11.0.0-dev.6 | 127 | 2/28/2022 |
11.0.0-dev.5 | 125 | 2/26/2022 |
11.0.0-dev.4 | 133 | 2/24/2022 |
11.0.0-dev.3 | 123 | 2/23/2022 |
11.0.0-dev.2 | 128 | 2/18/2022 |
Please check https://github.com/kephas-software/kephas/releases for the change log.
Also check the documentation and the samples from https://github.com/kephas-software/kephas/wiki and https://github.com/kephas-software/kephas/tree/master/Samples.