使用英语阅读

通过


使用 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 凭据提供程序。
  3. 尝试按顺序使用所有 NuGet 跨平台凭据提供程序。
  4. 如果尚未获取凭据,系统会使用标准基本身份验证对话框提示用户输入凭据。

实现 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。
bool isProxyRequest 如果此请求是获取代理身份验证凭据,则为真。 如果实现对获取代理凭据无效,则应返回 null。
bool isRetry 如此 如果以前为此 Uri 请求了凭据,但提供的凭据不允许授权访问。
bool nonInteractive 如果为 true,凭据提供程序必须禁止所有用户提示并使用默认值。
CancellationToken 取消令牌 应检查此取消令牌,用来确定请求凭据的操作是否已被取消。

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