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
- Visão geral de extensibilidade
- Autenticação e autorização — onde
${secret:...}é usado na prática, com os quatro esquemas embutidos.