首页 > 解决方案 > 在 Docker 映像中使用“dotnet”测试 Nuget 身份验证凭据

问题描述

如果提供的凭据无效,我正在寻找一种安全且直接的方法来使我的图像构建失败。问题是我需要从中提取包的仓库有一个策略,该策略会在尝试太多失败后锁定帐户——并且由于每个单独的包都算作一次单独的身份验证尝试,因此一次错误的构建尝试将锁定该帐户。

在我Dockerfile的中,我像这样设置了 nuget 源,然后像这样恢复(或发布/运行等)。

RUN dotnet nuget add source https://my-example-repo.jfrog.io/my-example/api/nuget/nuget  \
    -n Artifactory \
    -u ${JFROG_USERNAME} \
    -p ${JFROG_PASSWORD} \
    --store-password-in-clear-text
RUN dotnet restore 

理想的解决方案将是以下两件事之一:

  1. 如果任何包无法恢复,则该标志dotnet restore立即以非零代码退出,例如dotnet restore --failfast
  2. 使用当前凭据进行身份验证并在凭据不起作用时退出非零的单个、安全、幂等命令。

标签: .netdockernuget

解决方案


它看起来有点hacky,但我建议采用这种方法。

您可以简单地创建一个测试 C# 项目,其中一个引用来自您的私有存储库中的包。

然后您尝试通过dotnetCLI 恢复它。

如果您的凭据无效,它将失败,将有一个非零退出代码。


  1. 使用凭据配置 NuGet 源

如您所知,当您运行时dotnet restore,它使用一种特殊的机制来累积不同级别的设置:

  • 解决方案
  • 用户
  • 计算机

Microsoft Docs / 常见 NuGet 配置

因此,当您运行此命令时,您的用户nuget.config文件将被更新。

(在 Windows 上它位于那里%APPDATA%\NuGet\nuget.config

dotnet nuget add source https://my-example-repo.jfrog.io/my-example/api/nuget/nuget  \
    -n Artifactory \
    -u ${JFROG_USERNAME} \
    -p ${JFROG_PASSWORD} \
    --store-password-in-clear-text
  1. 创建一个名为的测试项目文件credentials-test.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <!-- Replace an example by your package from private repository. -->
    <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" />
  </ItemGroup>

</Project>
  1. 然后只需运行一个dotnet restore命令:
dotnet restore .\credentials-test.csproj

如果凭据有效,PowerShell 中的结果将是:

> dotnet restore .\credentials-test.csproj
  Determining projects to restore...
  Restored C:\Projects\nuget-restore-2\credentials-test.csproj (in 340 ms).
> $LastExitCode
0

如果凭据无效或任何其他故障,结果将是:

> dotnet restore .\credentials-test.csproj
  Determining projects to restore...
<SOME ERROR MESSAGE>
> $LastExitCode
1 <-- Or some different non-zero exit code

看起来不是很好。但有效。


只是为了好玩,我花了一些时间实现一个 .NET CLI 工具来为您提供一个 CLI 命令。然而,它比上面描述的想法更糟糕。

你可以在这里查看: https ://youtu.be/SanQAVAZM2o


推荐阅读