使用 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 包含内置凭据提供程序和插件凭据提供程序的列表。 在获取凭据之前,会按顺序尝试每个提供程序。
在凭据获取期间,凭据服务将按以下顺序尝试凭据提供程序,且在获取凭据后立即停止:
- 系统将从 NuGet 配置文件(使用内置
SettingsCredentialProvider
)提取凭据。 - 如果包源位于 Visual Studio Team Services 上,则会使用
VisualStudioAccountProvider
。 - 系统会按顺序尝试所有其他插件 Visual Studio 凭据提供程序。
- 按顺序尝试使用所有 NuGet 跨平台凭据提供程序。
- 如果尚未获取任何凭据,系统会使用标准基本身份验证对话框来提示用户输入凭据。
实现 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 凭据提供程序均须:
- 确定是否可以在启动凭据获取之前为目标 URI 提供凭据。 如果提供程序无法提供目标源的凭据,它则应返回
null
。 - 如果提供程序确实会处理针对目标 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
接口的凭据对象。