Autenticando feeds com provedores de credenciais nuget.exe

Na versão 3.3, o suporte foi adicionado para provedores de credenciais (v1) específicos nuget.exe. Desde então, na versão 4.8 (v2) foi adicionado suporte para provedores de credenciais que funcionam em todos os cenários de linha de comando (nuget.exe, dotnet.exe, msbuild.exe).

Consulte Consumindo pacotes de feeds autenticados para obter mais detalhes sobre todas as abordagens de autenticação.

nuget.exe Descoberta de provedor de credenciais

Os provedores de credenciais nuget.exe podem ser usados de 3 maneiras:

  • Globalmente: para disponibilizar um provedor de credenciais para todas as instâncias de execução nuget.exe no perfil do usuário atual, adicione-o ao %LocalAppData%\NuGet\CredentialProviders. Talvez seja necessário criar a pasta CredentialProviders. Os provedores de credenciais podem ser instalados na raiz da pasta CredentialProviders ou em uma subpasta. Se um provedor de credenciais tiver vários arquivos/assemblies, será possível usar subpastas para manter os provedores organizados.

  • A partir de uma variável de ambiente: os provedores de credenciais podem ser armazenados em qualquer lugar e acessíveis a nuget.exe definindo a variável de ambiente %NUGET_CREDENTIALPROVIDERS_PATH% para o local do provedor. Essa variável pode ser uma lista separada por ponto-e-vírgula (por exemplo, path1;path2) se você tiver vários locais.

  • Juntamente como nuget.exe: os provedores de credenciais nuget.exe podem ser colocados na mesma pasta que o nuget.exe.

Ao carregar provedores de credenciais, nuget.exe pesquisa os locais acima, em ordem, para qualquer arquivo chamado credentialprovider*.exee, em seguida, carrega esses arquivos na ordem em que são encontrados. Se existirem vários provedores de credenciais na mesma pasta, eles serão carregados em ordem alfabética.

Criação de um provedor de credenciais nuget.exe

Um provedor de credenciais é um executável de linha de comando, nomeado no formato CredentialProvider*.exe, que reúne entradas, adquire credenciais conforme apropriado e, em seguida, retorna o código de status de saída apropriado e a saída padrão.

Você deve fornecer o seguinte:

  • Determine se ele pode fornecer credenciais para o URI de destino antes de iniciar a aquisição de credenciais. Caso contrário, ele deve retornar o código de status 1 sem credenciais.
  • Não modificar NuGet.Config (como definir credenciais lá).
  • Manipule a configuração de proxy HTTP por conta própria, pois o NuGet não fornece informações de proxy para o plugin.
  • Retorne credenciais ou detalhes de erro para nuget.exe gravando um objeto de resposta JSON (veja abaixo) em stdout, usando codificação UTF-8.
  • Opcionalmente, emita log de rastreamento adicional para stderr. Nenhum segredo deve ser gravado para stderr, já que em níveis de detalhamento "normais" ou "detalhados" tais traços são ecoados pelo NuGet para o console.
  • Parâmetros inesperados devem ser ignorados, fornecendo compatibilidade direta com versões futuras do NuGet.

Parâmetros de entrada

Parâmetro/Comutação Descrição
Uri {value} O URI de origem do pacote que requer credenciais.
NonInteractive Se presente, o provedor não emite prompts interativos.
IsRetry Se presente, indica que essa tentativa é uma nova tentativa de uma tentativa com falha anterior. Os provedores geralmente usam esse sinalizador para garantir que ignorem qualquer cache existente e solicitem novas credenciais, se possível.
Detalhamento {value} Se presente, um dos seguintes valores: "normal", "silencioso" ou "detalhado". Se nenhum valor for fornecido, o padrão será "normal". Os provedores devem usar isso como uma indicação do nível de log opcional a ser emitido para o fluxo de erros padrão.

Códigos de saída

Código Result Descrição
0 Êxito As credenciais foram adquiridas com sucesso e foram gravadas para stdout.
1 ProviderNotApplicable O provedor atual não fornece credenciais para o URI fornecido.
2 Falha O provedor é o provedor correto para o URI fornecido, mas não pode fornecer credenciais. Nesse caso, o nuget.exe não tentará novamente a autenticação e falhará. Um exemplo típico é quando um usuário cancela um login interativo.

Saída padrão

Propriedade Observações
Nome de Usuário Nome de usuário para solicitações autenticadas.
Senha Senha para solicitações autenticadas.
Mensagem Detalhes opcionais sobre a resposta, usados somente para mostrar detalhes adicionais em casos de falha.

Exemplo stdout:

{ "Username" : "freddy@example.com",
    "Password" : "bwm3bcx6txhprzmxhl2x63mdsul6grctazoomtdb6kfbof7m3a3z",
    "Message"  : "" }

Solucionar problemas de um provedor de credenciais

No momento, o NuGet não fornece muito suporte direto para depuração de provedores de credenciais personalizadas; o problema 4598 está acompanhando esse trabalho.

Também é possível fazer o seguinte:

  • Execute nuget.exe com o switch -verbosity para inspecionar a saída detalhada.

  • Adicione mensagens de depuração em locais apropriados de stdout.

  • Certifique-se de que você está usando nuget.exe 3.3 ou superior.

  • Anexe o depurador na inicialização com este trecho de código:

    while (!Debugger.IsAttached)
    {
        System.Threading.Thread.Sleep(100);
    }
    Debugger.Break();