Multi-tenant support for ASP.NET Identity using Entity Framework
This library was created to solve a problem I asked on Stack Overflow, it was needed for a commercial project, this part has been open sourced in the hope that it may receive improvements and future support by receiving wider usage.
It is available to download as a NuGet package.
Additionally a Continious integration Build NuGet feed is also provided by AppVeyor https://ci.appveyor.com/nuget/aspnet-identity-entityframewor-avbe23sgoogy Add this feed to your NuGet Configuration Settings to include the CI build, which includes yet to be accepted pull requests.
The intention is to provide a means to allow for identical users (uniquely keyed upon email/username/external login) to register and authenticate multiple times under different tenants, but still remaining unique within a tenant, all within the same database and entity context.
The two entities that have been extended to support multi tenancy are IdentityUser
and IdentityUserLogin
, both of which have had the TenantId
property added.
Following the same patterns of Microsoft ASP.NET Identity EntityFramework there is both a generic and non generic equivalent proved:
- Use or extend
MultitenantIdentityUser
andMultitenantIdentityUserLogin
if you want theTenantId
to be a string - Extend
MultitenantIdentityUser<TKey, TTenantKey, TLogin, TRole, TClaim>
andMultitenantIdentityUserLogin<TKey, TTenantKey>
if you want customTenantId
.
The UserStore<TUser>
has been extended to take have a TenantId
and to override the necessary methods to implement multi-tenancy. The TenantId
needs to be specified directly otherwise an InvalidOperationException
will be thrown. See the MultitenantUserStore<TUser, TRole, TKey, TTenantKey, TUserLogin, TUserRole, TUserClaim>
for more details.
Lastly the IdentityDbContext<TUser>
has been extended to add the necessary validation and model creation to implement multi-tenancy. See the MultitenantIdentityDbContext<TUser, TRole, TKey, TTenantKey, TUserLogin, TUserRole, TUserClaim>
for more details.
Two simple sites that make use the package to allow for multi-tenancy are provided as example:
- Vanilla Implementation which is the standard MVC5 template project that uses a string primary keys.
- The changes necessary to provide multi-tenancy have been isolated to this commit.
- Integer Primary Key Implementation which is making a few more customisations to use integer primary keys
- The changes necessary to provide multi-tenancy have been isolated to this commit.