Stratara.Identity.EntityFrameworkCore 4.4.6

Prefix Reserved
There is a newer version of this package available.
See the version list below for details.
dotnet add package Stratara.Identity.EntityFrameworkCore --version 4.4.6
                    
NuGet\Install-Package Stratara.Identity.EntityFrameworkCore -Version 4.4.6
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Stratara.Identity.EntityFrameworkCore" Version="4.4.6" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Stratara.Identity.EntityFrameworkCore" Version="4.4.6" />
                    
Directory.Packages.props
<PackageReference Include="Stratara.Identity.EntityFrameworkCore" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Stratara.Identity.EntityFrameworkCore --version 4.4.6
                    
#r "nuget: Stratara.Identity.EntityFrameworkCore, 4.4.6"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Stratara.Identity.EntityFrameworkCore@4.4.6
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Stratara.Identity.EntityFrameworkCore&version=4.4.6
                    
Install as a Cake Addin
#tool nuget:?package=Stratara.Identity.EntityFrameworkCore&version=4.4.6
                    
Install as a Cake Tool

Stratara.Identity.EntityFrameworkCore

Derived. The behaviour described here is specified under openspec/specs/. Those specifications are the source; this page explains and illustrates them.

EF Core identity-directory plane for the Stratara stack: user↔tenant membership (many-to-many with tenant-scoped roles), active-tenant selection, and membership-backed authorization.

Contents

  • IdentityDirectoryDbContext<TContext> — standalone DbContext hosting all four directory tables (tenant_membership, active_tenant, setting_entry, api_key); derive a concrete context and own its migrations. To fold these into an existing context instead, call modelBuilder.ApplyIdentityDirectoryModel() in its OnModelCreating.
  • ModelBuilder.ApplyIdentityDirectoryModel() — adds the same tables to an existing context (for example your ASP.NET Identity context) so they share one migration lineage.
  • AddTenantMembershipStore<TContext>() — EF-backed ITenantMembershipStore: forward lookup (a user's tenants), reverse lookup (a tenant's members), upsert, GDPR sweeps per user/tenant, and membership-guarded active-tenant switching.
  • MembershipAuthorizationProvider / MembershipAuthorizationProvider<TUser> — the framework's default IAuthorizationProvider: role checks pass on tenant-scoped membership roles, the TUser variant additionally on global ASP.NET Identity roles (platform roles).
  • AddMembershipCrossTenantAuthorizer(...) — membership-backed ICrossTenantAuthorizer for strict tenant isolation, with configurable cross-tenant roles for the operator-impersonation path (platform administrators without membership in the target tenant).
  • AddPermissionCatalog(...) + AddCatalogPermissionResolver[<TUser>]() — the application's code-declared permission vocabulary with role grants, resolved from membership roles (and optionally global ASP.NET Identity roles) for [RequirePermission] enforcement and HTTP permission policies.
  • AddApiKeyStore<TContext>() — API keys and personal access tokens: stk_-prefixed 256-bit keys (hash-only storage), fail-closed validation with expiry/revocation, erasure sweeps. Machine keys are materialized as tenant memberships, so they flow through the same role/permission plane as human actors; PATs act as their bound user. ImportAsync stores a machine key the caller already holds (generated with ApiKeyFormat.CreateRawKey()) for setups where the key must exist before boot — idempotent, never mutating an already-stored key.
  • AddSettingCatalog(...) + AddSettingStore<TContext>() — scoped settings plane: code-declared SettingDefinitions, row-per-key EF storage (setting_entry), a Subject-fed ISettingProvider fallback chain (user-in-tenant → user → tenant → global → configuration → default), transparent AES-GCM encryption for IsEncrypted definitions, and per-user/per-tenant erasure sweeps.
  • AddTenantMembershipStoreFromContextFactory<TContext>(), AddApiKeyStoreFromContextFactory<TContext>(), AddSettingStoreFromContextFactory<TContext>() — the same three stores, taking a fresh context per operation from IDbContextFactory<TContext> instead of sharing the request's. See below.

One context for the request, or one per operation

The plain registrations give every directory store in a request the same context instance. A database context serves one operation at a time, so directory work issued concurrently inside one request fails on whichever operation arrives second — at the call site that lost the race, not the one that introduced the concurrency. Sharing also means a store's own commit commits whatever else the consumer has left unsaved on that context.

The …FromContextFactory variants remove both: each operation creates its own context and disposes it. In exchange, a store write no longer takes part in a transaction the consumer opened on their own scoped context. That trade is why the shared registration stays the default rather than being replaced.

They require AddDbContextFactory<TContext>(); a missing registration fails at first resolution. Keep the factory's options aligned with the scoped registration — interceptors, query filters and conventions are configured per registration, not per context type. Calling both variants for the same store leaves whichever ran first in place; they do not compose.

Dependencies

  • Microsoft.EntityFrameworkCore (+ Relational)
  • Microsoft.Extensions.Identity.Core
  • Stratara.Abstractions

Used together with Stratara.Mediator (authorizing mediator, tenant isolation) and Stratara.Identity.AspNetCore (sign-in claims bridge).

Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on Stratara.Identity.EntityFrameworkCore:

Package Downloads
Stratara.EventSourcing.EntityFrameworkCore

EF Core persistence for the Stratara event-sourced stack on PostgreSQL — write-store, read-store, ASP.NET Identity store — including a shared identity store with its migrations — shared conventions, value generators, and UnitOfWork primitives. Targets Npgsql; maps pgvector types for a model that uses them, and needs no database extension otherwise.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
4.7.0 455 10/30/2026
4.6.1 82 10/29/2026
4.6.0 181 10/28/2026
4.5.0 263 10/28/2026
4.4.10 197 10/26/2026
4.4.9 105 10/26/2026
4.4.8 242 10/24/2026
4.4.7 113 10/23/2026
4.4.6 210 10/22/2026
4.4.5 643 10/14/2026
4.4.4 379 10/10/2026
4.4.3 115 10/10/2026
4.4.2 463 10/2/2026
4.4.1 422 9/29/2026
4.4.0 156 9/27/2026
4.3.1 131 9/25/2026
4.3.0 399 9/23/2026
4.2.0 162 9/18/2026
4.1.1 96 9/16/2026
4.1.0 113 9/16/2026
Loading failed

A host on the Orleans execution model can now wait until a projection has applied what it committed, instead of
reading its read model and hoping the projection is through. Additive; no schema change and no migration.

### Added

- **`IProjectionProgress`** (`Stratara.Abstractions`), registered by `AddStrataraProjectionGrains()`.
 `MarkAsync()` returns a `StoreMark` that covers every entry committed at the time of the call, in every partition
 — on PostgreSQL also an entry that committed while another write was still open. `WaitAsync(projection, mark,
 timeout)`, with the projection named by its type or its framework name, answers with a `ProjectionWaitResult`:
 `Reached` only once the projection has applied every entry the mark covers; otherwise, at the limit, `Stalled`,
 `Suspended` or `TimedOut` with the partitions behind; `MarkNotApplicable` at once for a mark taken under another
 reader or partition count. A rebuild or a full replay during a wait is waited through; an unknown projection is
 refused. See *Read your own write* in the projection guide.
- **`ICommittedPositionReader.CommittedHeadAsync`**, the highest position the store shows as committed. The default
 answers `HeadAsync`; the native PostgreSQL reader answers it without the horizon its head is held back to. A
 reader of your own that holds its head back overrides it.

### Upgrade notes

- Adopt the wait once every silo runs this release: a silo of an earlier version does not answer it, and a wait
 whose partition lives there fails with the grain call's error.