使用经过身份验证的馈送源中的包

许多 NuGet作(如还原和安装)需要与一个或多个包源通信, 这些源可在 nuget.config 文件中配置

注释

使用你信任的包源。

对于 HTTP 源,NuGet 将发出未经身份验证的请求,如果服务器响应 HTTP 401 响应,NuGet 将按以下顺序搜索凭据:

  1. 环境变量 NuGetPackageSourceCredentials_{name}
  2. nuget.config 文件中的凭据
  3. 如果包源提供 NuGet 凭据提供程序,请使用 NuGet 凭据提供程序

要使用的凭据由包源确定。 因此,除非你使用凭据提供程序,否则你应该咨询软件包源以确定要使用的凭据。 包源通常会禁止您将用于登录网站的密码用于 NuGet。 通常需要创建个人访问令牌以用作 NuGet 的密码,但应检查所使用的 NuGet 服务器的文档。 某些包源(如 Azure DevOps 和 GitHub)具有作用域内访问令牌,因此可能需要确保创建的任何令牌都包含所需的范围。

管理凭据的安全最佳做法

尽管 NuGet 按上述顺序搜索凭据,但建议按以下顺序在使用专用源进行身份验证时安全地管理凭据:

  1. 凭据提供程序:强烈建议尽可能使用凭据提供程序。 此方法可避免以纯文本形式存储机密,并尽量减少通过源代码管理意外公开机密的风险。 此外,它通常会减少在凭据过期或更改时需要更新的位置的数量。 如果凭据提供程序支持单一登录,则可能会降低登录频率或需要保存凭据的位置数。 有关详细信息,请参阅 凭据提供程序 部分。

  2. nuget.config中的加密凭据 :如果凭据提供程序不可用,应考虑使用加密凭据。 此方法通过以加密格式存储凭据来提供额外的安全性层。 有关详细信息,请参阅nuget.config文件中的凭据部分。

    注释

    请注意,加密的密码仅在 Windows 上受支持。 此外,它们只能在同一台计算机和最初加密它们的同一用户上解密。

  3. 在 nuget.config中使用环境变量宏 :如果无法使用加密凭据,请考虑将凭据存储在具有环境变量宏 的nuget.config 文件中。 此方法允许引用包含实际凭据的环境变量。 它增强了透明度,并帮助最终用户了解其凭据的配置方式。 有关详细信息,请参阅nuget.config文件中的凭据部分。

  4. 直接使用环境变量:作为回退选项,可以直接将凭据存储在环境变量中。 但是,请注意,与 在nuget.config 文件中使用环境变量宏相比,此方法的可见性和控制度可能更低。 有关详细信息,请参阅有关 环境变量中凭据的部分。

  5. NuGet.Config 中的明文凭据:强烈建议使用上述选项之一。 如果这些选项不可行,则可以将凭据存储在 nuget.config 文件中。 但是,此选项只能在没有其他安全选项可用的环境中使用。 有关更多信息,请参阅nuget.config文件中的 凭据部分

    警告

    将凭据以明文形式存储在 nuget.config 文件中,尤其是在将文件保存在源代码管理中时,可能会增加意外凭据泄漏的可能性。 如果必须在 nuget.config 文件中存储凭据,请考虑使用上述更安全的选项之一。

通过遵循这些最佳做法,可以安全地对专用源进行身份验证,同时最大程度地降低敏感信息泄露的风险。

环境变量中的凭据

NuGet 将搜索一个名为NuGetPackageSourceCredentials_{name}的环境变量,其中{name}是你的nuget.config文件的包源中key="name"的值。 环境变量的值必须是 Username={username};Password={password},并且可以选择性地包括 ;ValidAuthenticationTypes={types}。 如果环境变量与 NuGet 约定不匹配,或者该值不符合 NuGet 的预期模式,NuGet 将无提示地忽略环境变量,并继续在其他地方搜索包源的凭据。 没有日志可以表明 NuGet 使用环境变量中的凭据,如果环境变量包含过期的机密,并且新机密将添加到 nuget.config 文件中,这可能会导致调试身份验证问题时出现问题,因为配置文件的优先级较低。

小窍门

在 CI/CD 管道中使用环境变量是一个不错的选择,可以最大程度地降低在日志中捕获机密的风险。

例如,请考虑以下 nuget.config 文件:

<configuration>
  <packageSources>
    <clear />
    <add key="Contoso" value="https://nuget.contoso.com/v3/index.json" />
  </packageSources>
</configuration>

在这种情况下,源名称为 Contoso NuGet 将查找环境变量名称 NuGetPackageSourceCredentials_Contoso。 某些平台区分大小写,因此请注意为环境名称和源名称使用正确的大写和小写字符,如 nuget.config 文件中定义。

如果用户名为 nugetUser 密码 secret123,则环境变量的值应设置为 Username=nugetUser;Password=secret123。 如果 NuGet 只应将此凭据用于 HTTP 基本身份验证,但不应使用此身份验证方案,则可以将环境变量的值设置为 Username=nugetUser;Password=secret123;ValidAuthenticationTypes=Basic。 有关有效身份验证类型的详细信息,请参阅有关nuget.config 文件中包凭据的文档

注释

环境变量对允许的字符有限制,不同的作系统可能有不同的限制。 例如,不允许空格。 因此,使用这一环境变量功能为使用任何平台环境变量无效字符的包源指定 NuGet 凭据。 在这种情况下,应在 nuget.config 文件中重命名包源。

nuget.config 文件中的凭据

nuget.config 文件可以包含包源凭据。 有关详细信息(包括语法),请参阅 包源凭据上的 nuget.config 文件参考文档部分 。 但是,在命令行上使用dotnet nuget update source 来设置凭据更容易。

警告

nuget.config 文件中设置凭据时,请小心,尤其是在将凭据保存为纯文本时。 如果将凭据写入源代码管理中的 nuget.config 文件,则会增加意外泄露机密的风险。

NuGet 从多个文件中累积设置时,建议将凭据保存到用户 nuget.config 文件。 我们还建议将包源保存在解决方案(源代码存储库) nuget.config 文件(包括元素 <clear /> )中,以确保生成可靠性。

nuget.config 文件中的用户名和明文密码可以通过在要使用的环境变量名称的开头和结尾添加% 来使用该环境变量。 有关详细信息,请参阅 有关使用环境变量 的nuget.config 参考文档

凭据提供程序

NuGet 具有扩展性模型,允许 插件提供 NuGet 凭据。 为了让 NuGet 发现,凭据提供程序必须安装在特定路径,这些路径在 .NET Framework(NuGet.exe、MSBuild 和 Visual Studio)与 .NET SDK(运行于 .NET 5+ 运行时)之间是不同的。

NuGet 有一个概念,能够以交互模式或非交互模式运行。 在非交互式模式下,被请求凭据提供程序不阻塞 NuGet。 在交互模式下,凭据提供程序可能会提示你登录。 不同的工具具有不同的默认值,因此,根据方案,交互模式可能需要选择加入或选择退出。

工具 违约 切换按钮
dotnet CLI 非交互式 --interactive 论点。 例如,dotnet restore --interactive
MSBuild 非交互式 NuGetInteractive MSBuild 属性。 例如,msbuild -t:restore -p:NuGetInteractive=true
NuGet.exe 交互 -NonInteractive 论点。 例如,nuget.exe restore -NonInteractive
Visual Studio 交互 无法在非交互模式下运行。

NuGet.exe 同时支持 V1 和 V2 凭据提供程序,而 MSBuild 和 .NET SDK 仅支持跨平台 (V2) 插件。

在 Visual Studio 中,NuGet 具有 Visual Studio 凭据提供程序接口,凭据提供程序可用于提供图形登录体验,或在必要时调用 Visual Studio API。 如果 Visual Studio 中找不到处理源的 Visual Studio 凭据提供程序,则 Visual Studio 中的 NuGet 将回退到命令行凭据提供程序。

Visual Studio 2017 版本 15.9 及更高版本包括 Azure Artifacts 的凭据提供程序,可在 Visual Studio、MSBuild 和 NuGet.exe中使用。 但是,Visual Studio 不包括 .NET SDK 的凭据提供程序,因此 必须单独安装 才能使用 dotnet CLI。

凭据提供程序列表

我们知道的凭据提供程序列表如下: