OutWit.Shared.Secrets.Settings
1.0.0
dotnet add package OutWit.Shared.Secrets.Settings --version 1.0.0
NuGet\Install-Package OutWit.Shared.Secrets.Settings -Version 1.0.0
<PackageReference Include="OutWit.Shared.Secrets.Settings" Version="1.0.0" />
<PackageVersion Include="OutWit.Shared.Secrets.Settings" Version="1.0.0" />
<PackageReference Include="OutWit.Shared.Secrets.Settings" />
paket add OutWit.Shared.Secrets.Settings --version 1.0.0
#r "nuget: OutWit.Shared.Secrets.Settings, 1.0.0"
#:package OutWit.Shared.Secrets.Settings@1.0.0
#addin nuget:?package=OutWit.Shared.Secrets.Settings&version=1.0.0
#tool nuget:?package=OutWit.Shared.Secrets.Settings&version=1.0.0
OutWit.Shared.Secrets.Settings
The bridge between OutWit.Common.Settings' SecretValue and
OutWit.Shared.Secrets' ISecretStore. The settings side keeps only a
reference — store key, set flag, and a non-secret hint; this package reaches
the actual secret at the point of use. The secret never touches the settings
file, the settings pipeline, or a backup of either.
Declare
In the settings template, the entry is a reference from day one:
{ "key": "ApiKey", "valueKind": "Secret", "value": "MyProduct/ApiKey||" }
The settings property is a SecretValue — StoreKey, IsSet, Hint — which
is everything a UI needs: show wit_sk_••••{Hint} when IsSet, offer
Replace/Clear, and disable the editor with a plain-language message when the
store's CheckAsync says it will not open.
Use
// Read, where the secret is actually needed:
var result = await settings.ApiKey.RevealAsync(store);
if (result.Status == SecretStatus.Found)
client.Authenticate(result.GetString()!);
// Write, from the settings UI — assign the updated reference back so the
// settings pipeline sees the change:
(var outcome, settings.ApiKey) = await settings.ApiKey.SetAsync(store, enteredKey);
// Clear:
(outcome, settings.ApiKey) = await settings.ApiKey.ClearAsync(store);
Migrating a plaintext "Password" setting
One-time, at startup, silently:
if (!string.IsNullOrEmpty(settings.LegacyApiKey))
{
(var outcome, settings.ApiKey) = await settings.ApiKey.SetAsync(store, settings.LegacyApiKey);
if (outcome.IsSuccess())
settings.LegacyApiKey = ""; // overwrite, then save
}
A secret that has lived in a plaintext settings file is a secret that has been disclosed — the old value survives in backups and support bundles. Migration ends with rotating the credential, not with moving it.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. 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. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. 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. |
-
net10.0
- OutWit.Common.Settings (>= 2.1.0)
- OutWit.Shared.Secrets.Providers (>= 1.0.0)
-
net8.0
- OutWit.Common.Settings (>= 2.1.0)
- OutWit.Shared.Secrets.Providers (>= 1.0.0)
-
net9.0
- OutWit.Common.Settings (>= 2.1.0)
- OutWit.Shared.Secrets.Providers (>= 1.0.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 |
|---|---|---|
| 1.0.0 | 111 | 8/31/2026 |