使用 nuget.exe 凭据提供程序对源进行身份验证

在版本 3.3 中添加了对 nuget.exe 特定 (v1) 凭据提供程序的支持。 随后,在版本 4.8 中添加了对 (v2) 凭据提供程序的支持,而这些提供程序适用于所有命令行场景(nuget.exedotnet.exemsbuild.exe)。

如需有关所有身份验证方法的详细信息,请参阅使用经过身份验证的源中的包

nuget.exe 凭据提供程序发现

可通过 3 种方式使用 nuget.exe 凭据提供程序:

  • 全局:若要使凭据提供程序可用于在当前用户配置文件下运行的 nuget.exe 的所有实例,请将其添加到 %LocalAppData%\NuGet\CredentialProviders 中。 可能需要创建 CredentialProviders 文件夹。 凭据提供程序可安装在 CredentialProviders 文件夹的根目录中,或安装在子文件夹中。 如果凭据提供程序具有多个文件/程序集,则可以使用子文件夹来使提供程序井然有序。

  • 从环境变量:凭据提供程序可存储在任意位置,并可通过将 %NUGET_CREDENTIALPROVIDERS_PATH% 环境变量设为提供程序位置,从而使 nuget.exe 可访问这些提供程序。 如果有多个位置,则此变量可以是由分号分隔的列表(如 path1;path2)。

  • 结合 nuget.exe:nuget.exe 凭据提供程序可与 nuget.exe 放在同一文件夹中。

加载凭据提供程序时,nuget.exe 会按顺序搜索上述位置以查找名为 credentialprovider*.exe 的任何文件,然后按找到的顺序加载这些文件。 如果多个凭据提供程序位于同一文件夹中,则按字母顺序加载它们。

创建 nuget.exe 凭据提供程序

凭据提供程序是一个命令行可执行文件,以 CredentialProvider*.exe 格式命名,可收集输入、适当地获取凭据,然后返回相应的退出状态代码和标准输出。

提供程序必须执行以下操作:

  • 确定是否可以在启动凭据获取之前为目标 URI 提供凭据。 如果不可以,它应返回状态代码 1,并且不返回凭据。
  • 不修改 NuGet.Config(例如在此处设置凭据)。
  • 自行处理 HTTP 代理配置,因为 NuGet 不向插件提供代理信息。
  • 使用 UTF-8 编码将 JSON 响应对象(见下文)写入 stdout,从而将凭据或错误详细信息返回到 nuget.exe
  • (可选)向 stderr 发送附加跟踪日志记录。 不应将任何机密写入 stderr,因为在“正常”或“详细”详细级别时,NuGet 会将此类跟踪回显到控制台。
  • 应忽略意外参数,以提供与 NuGet 未来版本的前向兼容性。

输入参数

参数/开关 说明
Uri {value} 需要凭据的包源 URI。
NonInteractive 如果存在,提供程序不会发出交互式提示。
IsRetry 如果存在,则表示此尝试是对之前失败尝试的一次重试。 提供程序通常使用此标志来确保其可绕过任何现有缓存,并在可能情况下提示输入新凭据。
Verbosity {value} 如果存在,则为以下值之一:“normal”、“quiet”或“detailed”。 如果未提供任何值,则默认为“normal”。 提供程序应将此用于可选日志记录的级别的指示,以发送到标准错误流。

退出代码

代码 Result 说明
0 成功 已成功获取凭据并已将其写入 stdout。
1 ProviderNotApplicable 当前提供程序不为给定的 URI 提供凭据。
2 失败 该提供程序是针对给定 URI 的正确提供程序,但不能提供凭据。 在此情况下,nuget.exe 不会重试身份验证,并且会失败。 一个典型的示例是用户取消交互式登录。

标准输出

properties 说明
用户名 经过身份验证的请求的用户名。
密码 经过身份验证的请求的密码。
Message 有关响应的可选详细信息,仅用于显示失败案例的其他详细信息。

示例 stdout:

{ "Username" : "freddy@example.com",
    "Password" : "bwm3bcx6txhprzmxhl2x63mdsul6grctazoomtdb6kfbof7m3a3z",
    "Message"  : "" }

对凭据提供程序进行故障排除

目前,NuGet 没有为调试自定义凭据提供程序提供太多的直接支持;问题 4598 正在跟踪此工作。

还可进行以下操作:

  • 运行带有 -verbosity 开关的 nuget.exe 以检查详细输出。

  • 将调试消息添加到位于适当位置的 stdout

  • 请确保使用 nuget.exe 3.3 或更高版本。

  • 在启动时将调试程序附加到此代码片段:

    while (!Debugger.IsAttached)
    {
        System.Threading.Thread.Sleep(100);
    }
    Debugger.Break();