使用 NuGet 凭据提供程序在 Visual Studio 中对源进行身份验证

NuGet Visual Studio 扩展 3.6 及以上版本支持凭据提供程序,以便 NuGet 能处理经过身份验证的源。 为 Visual Studio 安装 NuGet 凭据提供程序后,NuGet Visual Studio 扩展会根据需要自动获取并刷新经过身份验证的源的凭据。

可在 VsCredentialProvider 示例中找到示例实现。

在 Visual Studio 中,NuGet 采用内部 VsCredentialProviderImporter,而它也会通过扫描来查找插件凭据提供程序。 这些插件凭据提供程序必须可作为 IVsCredentialProvider类型的 MEF 导出来发现。

从 Visual Studio 中 4.8 及以上版本的 NuGet 开始,也支持新的跨平台身份验证插件。但出于性能原因,并不建议采用这些插件。

注意

Visual Studio 的 NuGet 凭据提供程序必须安装为常规 Visual Studio 扩展,且需 Visual Studio 2017 或更高版本。

Visual Studio 的 NuGet 凭据提供程序仅适用于 Visual Studio(而不适用于 dotnet restore 或 nuget.exe)。 有关 nuget.exe 的凭据提供程序,请参阅 nuget.exe 凭据提供程序。 有关 dotnet 和 msbuild 中的凭据提供程序,请参阅 NuGet 跨平台插件

为 Visual Studio 创建 NuGet 凭据提供程序

NuGet Visual Studio 扩展 3.6 及以上版本实现了用于获取凭据的内部 CredentialService。 CredentialService 包含内置凭据提供程序和插件凭据提供程序的列表。 在获取凭据之前,会按顺序尝试每个提供程序。

在凭据获取期间,凭据服务将按以下顺序尝试凭据提供程序,且在获取凭据后立即停止:

  1. 系统将从 NuGet 配置文件(使用内置 SettingsCredentialProvider)提取凭据。
  2. 如果包源位于 Visual Studio Team Services 上,则会使用 VisualStudioAccountProvider
  3. 系统会按顺序尝试所有其他插件 Visual Studio 凭据提供程序。
  4. 按顺序尝试使用所有 NuGet 跨平台凭据提供程序。
  5. 如果尚未获取任何凭据,系统会使用标准基本身份验证对话框来提示用户输入凭据。

实现 IVsCredentialProvider.GetCredentialsAsync

若要为 Visual Studio 创建 NuGet 凭据提供程序,请创建一个 Visual Studio 扩展,而该扩展会公开实现 IVsCredentialProvider 类型的公共 MEF 导出,并遵循下方概述的原则。

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

可在 VsCredentialProvider 示例中找到示例实现。

Visual Studio 的每个 NuGet 凭据提供程序均须:

  1. 确定是否可以在启动凭据获取之前为目标 URI 提供凭据。 如果提供程序无法提供目标源的凭据,它则应返回 null
  2. 如果提供程序确实会处理针对目标 URI 的请求,但无法提供凭据,则应引发异常。

Visual Studio 的自定义 NuGet 凭据提供程序必须实现 NuGet.VisualStudio 包中提供的 IVsCredentialProvider 接口。

GetCredentialAsync

输入参数 说明
Uri URI 正为其请求凭据的包源 URI。
IWebProxy 代理 在网络上通信时要使用的 Web 代理。 如果未配置代理身份验证,则为 Null。
布尔型 isProxyRequest 如果此请求旨在获取代理身份验证凭据,则为 True。 如果实现不适用于获取代理凭据,则应返回 null。
布尔型 isRetry 如果先前已为此 URI 请求凭据,但提供的凭据不允许经授权的访问,则为 True。
布尔型 nonInteractive 如果为 true,则凭据提供程序必须不显示所有用户提示并改用默认值。
CancellationToken 取消令牌 应检查此取消令牌以确定请求凭据的操作是否已取消。

返回值:实现 System.Net.ICredentials 接口的凭据对象