Orleans.Lattice.Explorer configuration
This page documents the Orleans.Lattice.Explorer packages, which are in progress, in the documentation for Orleans.Lattice 9.9.0 (release line 9.9), built 2026-10-04. It is also published as markdown, with every table and list, at configuration.md, and llms.txt lists every page.The Explorer rewrite exposes five public options types in the core web packages:
ExplorerConfigStoreOptions, LatticeExplorerWebOptions,
ExplorerReauthOptions, ExplorerSignOutOptions, and
ExplorerContentSecurityPolicyOptions. The UI sign-in chrome uses an internal
server-form-post option object; hosts configure it indirectly through the web
head and through the public re-authentication and sign-out options below.
This page also documents the launcher environment variables, the persisted JSON
configuration document, and LatticeConnectionSettings. Optional Entra packages
have their own option tables: ExplorerEntraOptions in
Orleans.Lattice.Explorer.Entra
and ExplorerEntraWebOptions in
Orleans.Lattice.Explorer.Entra.Web.
ExplorerConfigStoreOptions
Options for the local JSON configuration store. Bind it through
AddExplorerConfiguration(configure), or let AddLatticeExplorerWeb configure it
from LatticeExplorerWebOptions.ConfigFilePath and LATTICE_EXPLORER_CONFIG.
Constants
| Constant | Type | Value | Meaning |
|---|---|---|---|
DefaultFileName |
string |
"config.json" |
The default configuration file name. |
DefaultFolderName |
string |
"Orleans.Lattice.Explorer" |
The default per-user subfolder. |
Properties
| Property | Type | Default | Meaning |
|---|---|---|---|
FilePath |
string |
DefaultFilePath() |
The full path to the JSON configuration document. The default is under the per-user local application-data folder, for example %LOCALAPPDATA%\Orleans.Lattice.Explorer\config.json on Windows. |
LatticeExplorerWebOptions
Options controlling the embeddable web head. AddLatticeExplorerWeb registers
one instance in DI and MapLatticeExplorer reads it back so registration and
endpoint mapping agree on the mount point.
| Property | Type | Default | Meaning |
|---|---|---|---|
BasePath |
string |
"/" |
The base path the Explorer is mounted under, for example /explorer. Assignment normalises the value to a single leading slash with no trailing slash; the root remains /. |
ConfigFilePath |
string? |
null |
Explicit path for the JSON configuration backing store. When null, the web head uses LATTICE_EXPLORER_CONFIG, then the per-user app-data default. |
UseEnvironmentBootstrap |
bool |
true |
Registers the launcher-friendly environment bootstrap. When no configuration is persisted, it can seed the endpoint and optional sign-in credential from environment variables. |
AllowEnvironmentCredentialSeed |
bool |
false |
Allows the environment bootstrap to seed LATTICE_EXPLORER_USERNAME and LATTICE_EXPLORER_PASSWORD into an empty browser credential store. Enable only for a single-operator deployment; otherwise every anonymous browser would inherit the seeded operator credential. Ignored when UseEnvironmentBootstrap is false. |
AllowInteractiveEndpointConfiguration |
bool |
false |
Allows browser users to edit, test and save the process-wide endpoint configuration: it gates the header's Connection settings entry, the editable connection dialog and its Test connection. The default wraps the store as read-only and shows the endpoint in a read-only Cluster connection dialog, so deploy the endpoint through ConfigFilePath, LATTICE_EXPLORER_CONFIG, or LATTICE_EXPLORER_ENDPOINT. See The connection dialog. |
DataProtectionKeyRingBlobUri |
Uri? |
null |
Azure Blob Storage URI for a shared ASP.NET Data Protection key ring. Use this for multi-replica hosted-web sign-in so replicas can decrypt each other's cookies. DataProtectionKeyRingCredential is required when this is set. |
DataProtectionKeyRingCredential |
TokenCredential? |
null |
Azure credential used to read and write the key-ring blob named by DataProtectionKeyRingBlobUri. Required when the blob URI is set; ignored otherwise. |
DataProtectionApplicationName |
string? |
null |
Optional Data Protection application discriminator. Set the same stable value on every replica that must share cookies. |
ConfigureDataProtection |
Action<IDataProtectionBuilder>? |
null |
Escape hatch invoked after the built-in Data Protection configuration, so a host can add key encryption, a custom key lifetime, or a different store. |
Setting DataProtectionKeyRingBlobUri without
DataProtectionKeyRingCredential throws InvalidOperationException during
registration. A half-configured shared key ring fails closed instead of silently
falling back to a per-instance ephemeral key ring.
ExplorerReauthOptions
Configures where the session chrome sends the browser when a token-based sign-in
latches into a revoked state and needs a fresh interactive sign-in.
AddExplorerAuth registers a default instance with no challenge path. A provider
such as hosted-web Entra registers its own instance to point at its mapped
re-authentication endpoint.
Constants
| Constant | Type | Value | Meaning |
|---|---|---|---|
DefaultReturnUrlParameter |
string |
"returnUrl" |
Default query-string parameter name for the local return URL. |
Properties
| Property | Type | Default | Meaning |
|---|---|---|---|
ChallengePath |
string? |
null |
Head-relative path of the forced-interactive challenge endpoint. When null or empty, the interstitial performs a full-page reload instead. |
AppendReturnUrl |
bool |
true |
Appends the current local path and query to ChallengePath as a return URL. The challenge endpoint must validate it as local. |
ReturnUrlParameter |
string |
DefaultReturnUrlParameter ("returnUrl") |
Query-string parameter used for the return URL. |
ExplorerSignOutOptions
Configures a federated sign-out endpoint for a provider whose sign-in creates a
separate browser identity-provider session. AddExplorerAuth registers the
local-only default; a provider can register an instance that points at its own
server endpoint.
| Property | Type | Default | Meaning |
|---|---|---|---|
FederatedSignOutPath |
string? |
null |
Head-relative path the identity menu posts to for federated sign-out. When set, it wins over the local sign-out path. When null or empty, the session chrome clears only the local State API credential. |
ExplorerContentSecurityPolicyOptions
Carries extra Content-Security-Policy source expressions that the web head folds
into the form-action directive. Federated sign-out providers use this when a
local sign-out POST redirects to an identity-provider end-session URL.
| Property | Type | Default | Meaning |
|---|---|---|---|
AdditionalFormActionSources |
IList<string> (get-only) |
Empty | Extra sources appended to form-action, which already contains 'self'. Blank entries and entries containing whitespace, ;, or , are dropped when the header is composed. |
Environment variables
The launcher bootstrap, registered while
LatticeExplorerWebOptions.UseEnvironmentBootstrap is true, reads every
variable below except LATTICE_EXPLORER_CONFIG, which AddLatticeExplorerWeb
reads at registration whatever that option says.
| Variable | Meaning |
|---|---|
LATTICE_EXPLORER_CONFIG |
Overrides the JSON configuration document path when LatticeExplorerWebOptions.ConfigFilePath is unset. |
LATTICE_EXPLORER_ENDPOINT |
State API endpoint URL to seed when no configuration is persisted. |
LATTICE_EXPLORER_INSECURE_DEV |
Truthy values (1, true, yes, on, case-insensitive) seed InsecureLoopbackDev and allow unencrypted HTTP/2 for a loopback development endpoint. |
LATTICE_EXPLORER_TRANSPORT_HEADERS |
Optional semicolon-separated Name=Value pairs for non-secret transport headers attached to every call. Entries without = or without a name are skipped; values may be empty or contain =. |
LATTICE_EXPLORER_USERNAME, LATTICE_EXPLORER_PASSWORD |
Optional Basic credential seed. The web head withholds it unless AllowEnvironmentCredentialSeed is also true. |
The endpoint seed is held in memory and used only when no persisted configuration exists. The credential seed is exposed through a separate in-memory credential seam, never through the persisted configuration document.
The bootstrap reads its variables through IExplorerEnvironment, which defaults
to the process environment (ProcessExplorerEnvironment). A host that registers
its own IExplorerEnvironment before calling AddLatticeExplorerWeb supplies the
values instead, as the Explorer sample does.
LATTICE_EXPLORER_CONFIG is always read from the process environment.
The configuration document
The configuration store persists one ExplorerConfiguration record as JSON at
ExplorerConfigStoreOptions.FilePath, using camelCase names and case-insensitive
reading. A missing, corrupt or unreadable document reads as no configuration, so
the launcher's endpoint seed applies when there is one; a transport-invalid
document leaves the Explorer unconfigured. Saves write a temporary file and then
move it into place.
On the web head, saves are refused, and the browser is offered neither the
connection form nor its test, unless AllowInteractiveEndpointConfiguration is
true.
| Property | JSON name | Type | Default | Meaning |
|---|---|---|---|---|
SchemaVersion |
schemaVersion |
int |
CurrentSchemaVersion (2) |
Document schema version. |
Endpoint |
endpoint |
string |
"" |
State API endpoint, for example https://host:443 or http://localhost:5199. |
TransportMode |
transportMode |
ExplorerTransportMode (number) |
Secure (0) |
Secure requires https for non-loopback endpoints. InsecureLoopbackDev (1) is the explicit plaintext development opt-in for loopback endpoints. |
AllowUnencryptedHttp2 |
allowUnencryptedHttp2 |
bool |
false |
Allows h2c for a plain http:// local development endpoint. Ignored for https://. |
Headers |
headers |
IReadOnlyDictionary<string, string>? |
null |
Optional non-secret metadata headers mapped to the authentication seam. Interactive sign-in replaces this seam, so do not use it for routing headers that must survive sign-in. |
TransportHeaders |
transportHeaders |
IReadOnlyDictionary<string, string>? |
null |
Optional non-secret transport headers attached to every call regardless of sign-in state, for example X-Azure-FDID for an origin-locked proxy. |
LatticeConnectionSettings
ExplorerConfiguration.ToConnectionSettings() maps the persisted document to
this immutable connection snapshot. Endpoint becomes Address,
AllowUnencryptedHttp2 is copied, non-empty Headers becomes
Authentication, and non-empty TransportHeaders is copied. TransportMode is
validated before the settings are applied and has no property on the live record.
It sets no ActiveTenantProvider: a LatticeStateConnection constructed with a
tenant source, which is the constructor dependency injection selects once the
head registers tenancy, attaches that source to any settings that carry none.
| Property | Type | Default | Meaning |
|---|---|---|---|
Address |
string |
none (required) |
State API endpoint. Invalid addresses leave the connection faulted with an invalid-endpoint status rather than throwing from the UI. |
AllowUnencryptedHttp2 |
bool |
false |
Enables h2c for plain http:// development endpoints. It is also required before a static sign-in credential is sent to a non-https endpoint. |
Authentication |
LatticeCallAuthentication? |
null |
Authentication seam attached to calls. null connects anonymously. |
TransportHeaders |
IReadOnlyDictionary<string, string>? |
null |
Non-secret headers attached to every call regardless of sign-in state. |
ActiveTenantProvider |
ILatticeActiveTenantProvider? |
null |
Live source of the tenant every call asserts through the lattice-active-tenant header (LatticeActiveTenantAssertion.DefaultHeaderName). It is read as each call starts, never when the channel is built, so a tenant switch changes the next call without a rebuild. When it is set, the connection owns that header: a value for it among TransportHeaders is replaced by the provider's answer, or removed when the provider asserts none. null asserts no tenant. The web head's tenancy registration (AddExplorerTenantView) supplies a per-circuit provider that asserts the circuit's active tenant, and nothing for the reserved default tenant. |
DegradeAfter |
TimeSpan |
5 seconds | Time a connection may keep failing transiently before degrading to Faulted. |
HealthCheckInterval |
TimeSpan |
1 second | How often the background monitor probes while connecting, reconnecting, or faulted. |
TransientRetryBackoff |
TimeSpan |
250 milliseconds | Delay between inline transient retries. |
MaxTransientRetries |
int |
2 |
Inline transient retry count before surfacing a LatticeStateApiException; load-shed ResourceExhausted failures are not retried inline. |
The four timing properties can be set by code that calls ConfigureAsync
directly. They are not exposed through the JSON document, public options, or
environment variables used by the shipped web head.
Internal session chrome configuration
Area visibility is not host-configured: each native area probes its facade and is
either visible, hidden, or visible with an unavailable reason. The web head
configures the session chrome internally so Basic sign-in posts to auth/login
and local sign-out posts to auth/logout under the Explorer base href.