使用 nuget.exe 凭据提供程序对源进行身份验证
在版本 3.3
中添加了对 nuget.exe
特定 (v1) 凭据提供程序的支持。 随后,在版本 4.8
中添加了对 (v2) 凭据提供程序的支持,而这些提供程序适用于所有命令行场景(nuget.exe
、dotnet.exe
、msbuild.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”。 提供程序应将此用于可选日志记录的级别的指示,以发送到标准错误流。 |
退出代码
代码 | 结果 | 说明 |
---|---|---|
0 | Success | 已成功获取凭据并已将其写入 stdout。 |
1 | ProviderNotApplicable | 当前提供程序不为给定的 URI 提供凭据。 |
2 | 失败 | 该提供程序是针对给定 URI 的正确提供程序,但不能提供凭据。 在此情况下,nuget.exe 不会重试身份验证,并且会失败。 一个典型的示例是用户取消交互式登录。 |
标准输出
properties | 备注 |
---|---|
用户名 | 经过身份验证的请求的用户名。 |
密码 | 经过身份验证的请求的密码。 |
消息 | 有关响应的可选详细信息,仅用于显示失败案例的其他详细信息。 |
示例 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();