Autenticación de fuentes en Visual Studio con proveedores de credenciales de NuGet

La extensión NuGet Visual Studio 3.6+ admite proveedores de credenciales, que permiten que NuGet funcione con fuentes autenticadas. Después de instalar un proveedor de credenciales de NuGet para Visual Studio, la extensión NuGet Visual Studio adquirirá y actualizará automáticamente las credenciales de las fuentes autenticadas según sea necesario.

Puede encontrar una implementación de ejemplo en el ejemplo vsCredentialProvider.

En Visual Studio, NuGet usa un elemento VsCredentialProviderImporter interno que también examina proveedores de credenciales de complementos. Estos proveedores de credenciales de complementos deben ser reconocibles como una exportación MEF de tipo IVsCredentialProvider.

A partir de la versión 4.8+, NuGet en Visual Studio también admite los nuevos complementos de autenticación multiplataforma, pero no son el enfoque recomendado por motivos de rendimiento.

Nota:

Los proveedores de credenciales de NuGet para Visual Studio se deben instalar como una extensión normal de Visual Studio y necesitarán Visual Studio 2017 o posterior.

Los proveedores de credenciales de NuGet para Visual Studio solo funcionan en Visual Studio (no en dotnet restore ni nuget.exe). Para obtener información sobre los proveedores de credenciales con nuget.exe, vea Proveedores de credenciales de nuget.exe. Para conocer los proveedores de credenciales en dotnet y msbuild, vea Complementos multiplataforma de NuGet

Creación de un proveedor de credenciales de NuGet para Visual Studio

La extensión NuGet Visual Studio 3.6+ implementa un objeto credentialService interno que se usa para adquirir credenciales. CredentialService tiene una lista de proveedores de credenciales integradas y de complemento. Cada proveedor se prueba secuencialmente hasta que se adquieren las credenciales.

Durante la adquisición de credenciales, el servicio de credenciales probará los proveedores de credenciales en el orden siguiente, y se detendrá tan pronto como se adquieran las credenciales:

  1. Las credenciales se capturarán de los archivos de configuración de NuGet (mediante SettingsCredentialProvider).
  2. Si el origen del paquete está en Visual Studio Team Services, se usará VisualStudioAccountProvider.
  3. Todos los demás proveedores de credenciales de complementos de Visual Studio se probarán secuencialmente.
  4. Intente usar todos los proveedores de credenciales multiplataforma de NuGet secuencialmente.
  5. Si aún no se han adquirido credenciales, se le pedirá al usuario que use un cuadro de diálogo de autenticación básica estándar.

Implementación de IVsCredentialProvider.GetCredentialsAsync

Para crear un proveedor de credenciales de NuGet para Visual Studio, cree una extensión de Visual Studio que exponga una exportación MEF pública que implemente el tipo IVsCredentialProvider y cumpla los principios descritos a continuación.

public interface IVsCredentialProvider
{
    Task<ICredentials> GetCredentialsAsync(
        Uri uri,
        IWebProxy proxy,
        bool isProxyRequest,
        bool isRetry,
        bool nonInteractive,
        CancellationToken cancellationToken);
}

Puede encontrar una implementación de ejemplo en el ejemplo vsCredentialProvider.

Cada proveedor de credenciales de NuGet para Visual Studio debe hacer lo siguiente:

  1. Determinar si puede proporcionar credenciales para el URI de destino antes de iniciar la adquisición de credenciales. Si el proveedor no puede proporcionar credenciales para el origen de destino, debe devolver null.
  2. Si el proveedor controla las solicitudes para el URI de destino, pero no puede proporcionar credenciales, se debe iniciar una excepción.

Un proveedor de credenciales de NuGet personalizado para Visual Studio debe implementar la interfaz IVsCredentialProvider disponible en el paquete NuGet.VisualStudio.

GetCredentialAsync

Parámetro de entrada Descripción
Uri uri URI de origen del paquete para el que se solicitan las credenciales.
Proxy IWebProxy Proxy web que se usará al comunicarse en la red. Null si no hay ninguna autenticación de proxy configurada.
bool isProxyRequest True si esta solicitud es para obtener credenciales de autenticación de proxy. Si la implementación no es válida para adquirir credenciales de proxy, se debe devolver null.
bool isRetry True si las credenciales se han solicitado previamente para este URI, pero las proporcionadas no han permitido el acceso autorizado.
bool nonInteractive Si es true, el proveedor de credenciales debe suprimir todas las solicitudes de usuario y, en su lugar, utilizar valores predeterminados.
CancellationToken cancellationToken Este token de cancelación se debe comprobar para determinar si la operación que solicita credenciales se ha cancelado.

Valor devuelto: un objeto de credenciales que implementa la interfaz System.Net.ICredentials.