Autenticación de fuentes con proveedores de credenciales de nuget.exe

En la versión 3.3, se ha agregado compatibilidad con los proveedores de credenciales específicos de nuget.exe (v1). Desde entonces, en la versión 4.8 se ha agregado compatibilidad con proveedores de credenciales (v2) que funcionan en todos los escenarios de línea de comandos (nuget.exe, dotnet.exe, msbuild.exe).

Vea Consumo de paquetes de fuentes autenticadas para obtener más detalles sobre todos los métodos de autenticación.

Detección de proveedores de credenciales de nuget.exe

Los proveedores de credenciales de nuget.exe se pueden usar de tres maneras:

  • Globalmente: para que un proveedor de credenciales esté disponible para todas las instancias de nuget.exe ejecutadas en el perfil del usuario actual, agréguelo a %LocalAppData%\NuGet\CredentialProviders. Es posible que tenga que crear la carpeta CredentialProviders. Los proveedores de credenciales se pueden instalar en la raíz de la carpeta CredentialProviders o en una subcarpeta. Si un proveedor de credenciales tiene varios archivos o ensamblados, puede usar las subcarpetas para mantener organizados los proveedores.

  • Desde una variable de entorno: los proveedores de credenciales se pueden almacenar en cualquier lugar y hacer que sean accesibles para nuget.exe si se establece la variable de entorno %NUGET_CREDENTIALPROVIDERS_PATH% en la ubicación del proveedor. Esta variable puede ser una lista separada por punto y coma (por ejemplo, path1;path2) si tiene varias ubicaciones.

  • Junto a nuget.exe: los proveedores de credenciales de nuget.exe se pueden colocar en la misma carpeta que nuget.exe.

Al cargar proveedores de credenciales, nuget.exe busca en las ubicaciones anteriores, en orden, cualquier archivo denominado credentialprovider*.exe y, después, carga esos archivos en el orden en que se encuentran. Si hay varios proveedores de credenciales en la misma carpeta, se cargan en orden alfabético.

Creación de un proveedor de credenciales de nuget.exe

Un proveedor de credenciales es un ejecutable de línea de comandos, denominado en el formulario CredentialProvider*.exe, que recopila entradas, adquiere las credenciales según corresponda y, a continuación, devuelve el código de estado de salida y la salida estándar correspondientes.

Un proveedor debe hacer lo siguiente:

  • Determinar si puede proporcionar credenciales para el URI de destino antes de iniciar la adquisición de credenciales. En caso contrario, debe devolver el código de estado 1 sin credenciales.
  • No modificar NuGet.Config (como la configuración de las credenciales).
  • Controlar la configuración del proxy HTTP por su cuenta, ya que NuGet no proporciona información del proxy al complemento.
  • Devolver las credenciales o los detalles del error a nuget.exe escribiendo un objeto de respuesta JSON (véase a continuación) en stdout, usando la codificación UTF-8.
  • También puede emitir un registro de seguimiento adicional a stderr. No se debe escribir ningún secreto en stderr, ya que, en los niveles de detalle "normal" o "detailed", NuGet repite estos seguimientos en la consola.
  • Los parámetros inesperados se deben omitir, lo que proporciona compatibilidad con versiones posteriores de NuGet.

Parámetros de entrada

Parámetro o modificador Descripción
Uri {valor} El URI de origen del paquete que requiere credenciales.
NonInteractive Si está presente, el proveedor no emite mensajes interactivos.
IsRetry Si está presente, indica que este intento es un reintento de un intento anterior con errores. Los proveedores suelen usar esta marca para asegurarse de que omiten cualquier caché existente y solicitan nuevas credenciales si es posible.
Nivel de detalle {valor} Si está presente, uno de los siguientes valores: "normal", "quiet" o "detailed". Si no se proporciona ningún valor, el valor predeterminado es "normal". Los proveedores deben usar esto como indicación del nivel de registro opcional que se va a emitir en el flujo de error estándar.

Códigos de salida

Código Resultado Descripción
0 Correcto Las credenciales se han adquirido correctamente y se han escrito en stdout.
1 ProviderNotApplicable El proveedor actual no proporciona credenciales para el URI especificado.
2 Error El proveedor es el proveedor correcto para el URI especificado, pero no puede proporcionar las credenciales. En este caso, nuget.exe no volverá a intentar la autenticación y se producirá un error. Un ejemplo típico es cuando un usuario cancela un inicio de sesión interactivo.

Salida estándar

Propiedad Notas
Nombre de usuario Nombre de usuario para las solicitudes autenticadas.
Contraseña Contraseña para las solicitudes autenticadas.
Mensaje Detalles opcionales sobre la respuesta, que solo se usan para mostrar detalles adicionales en casos de error.

stdout de ejemplo:

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

Solución de problemas de un proveedor de credenciales

En la actualidad, NuGet no admite de forma muy directa la depuración de proveedores de credenciales personalizados. Se está realizando un seguimiento de esto en el problema 4598.

También puede hacer lo siguiente:

  • Ejecutar nuget.exe con el modificador -verbosity para inspeccionar la salida detallada.

  • Agregar mensajes de depuración a stdout en los lugares adecuados.

  • Asegurarse de que está usando nuget.exe 3.3 o una versión superior.

  • Adjuntar el depurador durante el inicio con este fragmento de código:

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