Guia — ISecretResolver

Uma fonte de segredos nova, ativada pela chave em ${secret:<chave>:<referência>}. O core traz duas implementações prontas: env (variável de ambiente) e file (arquivo). Um cofre de segredos dedicado — Vault, um key vault de nuvem, um secrets manager — pode ser adicionado por um pacote de terceiro sem esperar por uma implementação embutida.

Exemplo mínimo

using Pipevine.Security.Abstractions.Secrets;

// A chave usada na referência: ${secret:acmevault:caminho/do/segredo}
public sealed class AcmeVaultSecretResolver(AcmeVaultClient client) : ISecretResolver
{
    public async ValueTask<string?> ResolveAsync(string reference, CancellationToken ct)
    {
        // "reference" é o texto depois do segundo ':' — aqui, "caminho/do/segredo".
        return await client.GetSecretAsync(reference, ct).ConfigureAwait(false);
    }
}

Referência real, mínima, já embutida no core:

public sealed class EnvironmentVariableSecretResolver : ISecretResolver
{
    public ValueTask<string?> ResolveAsync(string reference, CancellationToken ct) =>
        ValueTask.FromResult(Environment.GetEnvironmentVariable(reference));
}

Ativação

services.AddPipevineSecurity(); // registra "env" e "file" sem sobrescrever registros existentes
services.AddKeyedSingleton<ISecretResolver, AcmeVaultSecretResolver>("acmevault");
schemes:
  - id: partner-basic
    scheme: basic
    users:
      - { username: acme, password: "${secret:acmevault:prod/basic/acme-password}" }

Todo esquema que exige segredo (o esquema basic embutido, por exemplo) resolve através de um registro central de resolvers, pela chave — sem precisar conhecer de antemão quais resolvers existem no sistema.

Para onde ir daqui