Concierge.Auth.Client.Secrets 1.0.3

dotnet add package Concierge.Auth.Client.Secrets --version 1.0.3
                    
NuGet\Install-Package Concierge.Auth.Client.Secrets -Version 1.0.3
                    
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="Concierge.Auth.Client.Secrets" Version="1.0.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Concierge.Auth.Client.Secrets" Version="1.0.3" />
                    
Directory.Packages.props
<PackageReference Include="Concierge.Auth.Client.Secrets" />
                    
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 Concierge.Auth.Client.Secrets --version 1.0.3
                    
#r "nuget: Concierge.Auth.Client.Secrets, 1.0.3"
                    
#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 Concierge.Auth.Client.Secrets@1.0.3
                    
#: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=Concierge.Auth.Client.Secrets&version=1.0.3
                    
Install as a Cake Addin
#tool nuget:?package=Concierge.Auth.Client.Secrets&version=1.0.3
                    
Install as a Cake Tool

Concierge.Auth.Client.Secrets

Self-service credential rotation against AuthService (contract §10.3), built on top of Concierge.Auth.Client's client_credentials table.

Install and register

services.AddConciergeAuthClient(configuration, db => db.UseNpgsql(cs, npgsql =>
    npgsql.MigrationsHistoryTable("__EFMigrationsHistory", "concierge"))); // base package — required first
services.AddConciergeSecretManagement(configuration); // binds "Concierge:AuthClient:SecretRotation"

ConciergeSecretRotationOptions.HeaderName (default X-Api-Key) is the only option this package adds — everything else (AuthServiceBaseUrl, ClientKey) comes from the base package's ConciergeAuthClientOptions.

First credential (no self-registration)

There is no self-registration path (contract §10.1, invariant 1) — the first credential is always issued by an admin and delivered out-of-band by email. Import it once:

await credentialStore.ImportInitialSecretAsync(secretFromEmail, cancellationToken);

Rotation

var outcome = await rotationClient.RotateAsync(cancellationToken);
if (outcome.IsFailure)
{
    // outcome.Error.Code is one of:
    //   ROTATION_NO_ACTIVE_CREDENTIAL — nothing imported yet, admin re-issue required
    //   ROTATION_REJECTED            — 401/403 from AuthService; NEVER retry this,
    //                                   the credential is already dead (lost a
    //                                   concurrent rotation race, or was revoked)
    //   ROTATION_UNAVAILABLE         — AuthService unreachable/5xx after retries
    //   ROTATION_PERSIST_FAILED      — AuthService rotated but the local commit
    //                                   failed; the credential may be lost, admin
    //                                   re-issue required, do not retry
}

RotateAsync calls POST /client-services/v1/:clientKey/rotate with the current active secret in the configured header, then revokes the old row and inserts the new one in one database transaction. A 401/403 is never retried — contract §10 invariant 8: it means the credential is already dead, not a transient fault, and blind-retrying would hammer AuthService forever without recovering. Timeouts and 5xx get up to 3 bounded attempts; 401/403 do not.

Logging constraint

The header carrying the secret is per-client configured and cannot be statically deny-listed (contract §10.6) — this package never passes a raw header collection to any logger, and does not log at all. The raw secret is never logged, persisted in an exception message, or echoed in a Result message; only its SHA-256 fingerprint is ever surfaced.

Out of scope here

JWKS, peer public keys, middleware, profile operations, RabbitMQ — see the other extension packages.

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 (3)

Showing the top 3 NuGet packages that depend on Concierge.Auth.Client.Secrets:

Package Downloads
Concierge.Auth.Client.Keys

JWKS signing-key retrieval (human-token verification, public endpoint), peer public-key lookup (service-to-service, credentialed), and own peer-keypair import/store (is_own=true, encrypted at rest) for the THISO Concierge.* client SDK. Two separate, unrelated key systems — kept in separate interfaces, storage, and caches; see contract assumption #100.

Concierge.Auth.Client.Profiles

User profile read/write against AuthService (contract §10.7) plus a thiso.events consumer that mirrors profile and status changes into the client's own user entity, for the THISO Concierge.* client SDK.

Concierge.Auth.Client.Tokens

Obtains typ:"client" JWTs from POST /api/v1/auth/token for the THISO Concierge.* client SDK — in-memory cache, single-flight refresh, and a DelegatingHandler that attaches Authorization: Bearer. Counterpart to Concierge.Auth.Client.AuthGuard's JWT validation lane; authenticates with IClientCredentialStore from Concierge.Auth.Client.Secrets.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.3 204 9/10/2026
1.0.2 502 8/24/2026
1.0.1 128 8/17/2026
1.0.0 141 8/17/2026