配置NuGet服务器使用身份验证

25

NuGet 1.5的发布说明指出:

NuGet now supports connecting to private repositories that require basic 
or NTLM authentication.

然而,在其中包含的链接只是简单地指向“托管自己的NuGet feeds”页面,没有进一步提及如何设置身份验证。

我想建立一个可以通过互联网以https方式访问的NuGet服务器,但只允许那些成功认证的人查看或下载服务器上的软件包。

我按照文档中“创建远程Feeds”部分所述创建了一个不带身份验证的应用程序,并在内部网络中运行得很好。我需要做什么来启用此存储库上的身份验证?

另外一个要求是解决方案不应该耗费数百美元(前两个答案推广可能可以解决问题但成本很高的产品)。

2个回答

47
这可以通过在 Web 站点上启用 Windows 身份验证并通过 Sources 命令行选项在构建服务器上添加凭据来完成,默认情况下,凭据使用 DPAPI 密钥存储,该密钥受限于当前用户在当前计算机上(因此,对于构建服务器,您需要在服务帐户下登录时添加凭据。)
对于开发人员的工作站,您只需要在 NuGet 包管理器中添加源,然后在刷新源时输入/存储凭据(应提示您)。
步骤 1 - 在 NuGet 服务器上要求身份验证(IIS 配置)
您需要确保已为 IIS 安装了要使用的身份验证模块,对于 NTLM auth,您将需要 Windows 身份验证模块。安装后,您可以打开 IIS 管理器,展开到您的网站,打开身份验证设置并启用 Windows 身份验证,请务必禁用任何您不想支持的身份验证模块(例如匿名、基本等)。
为确保使用用户凭据,请右键单击站点并选择“高级设置”,然后单击“物理路径凭据”按钮。在对话框中,请确保选择“应用程序用户(穿透身份验证)”。

关于Windows身份验证的标准IIS配置的更详细信息可以在TechNet上找到,其中包括从命令行进行配置和启用Negotiate(如果这是您的目标)。

步骤2 - 向NuGet配置中添加源(构建服务器、发布者)

nuget.exe sources add -Name "Fabrikam Feed" -Source "https://nuget.fabrikam.com:443/nuget/"
nuget.exe sources add -Name "Fabirkam Publish" -Source "https://nuget.fabirkam.com:443/"

在这里,我们添加了两个条目,其中一个将被用作正常的身份验证Feed URL(用于从服务器获取软件包)。第二个将用于发布到服务器(添加或更新nupkg文件)。
第三步 - 更新已添加源的凭据(构建服务器、发布者)。
nuget.exe sources update -Name "Fabrikam Feed" -Source "https://nuget.fabrikam.com:443/nuget/" -UserName "Developer" -Password "g0d"
nuget.exe sources update -Name "Fabrikam Publish" -Source "https://nuget.fabrikam.com:443/" -UserName "Developer" -Password "g0d"

在配置文件中添加了凭据,如果您查看 %APPDATA%\NuGet\NuGet.config ,您应该能够看到您添加的源以及加密后的凭据。

如果您无法作为服务器登录,可以通过使用 StorePasswordInClearText 选项来存储明文凭据,但在共享环境中不建议这样做。

步骤 4 - (可选)禁用 Visual Studio 中的发布 URL(开发人员)

打开 Visual Studio 并导航到 NuGet 包管理器设置对话框,取消选中“Fabrikam Publish”源。这不会影响您发布的能力,但是如果您不禁用此源,则尝试刷新“所有”源的软件包时将会收到错误提示(因为它是一个发布 URL 而不是源 URL)。

步骤 5 - (可选)在 Visual Studio 中存储 Windows 凭据(开发人员)

打开 Visual Studio 并导航到 NuGet 包管理器,单击 "Fabrikam Feed"。您应该会提示输入凭据。您可以在此处输入凭据并勾选保存/记住选项。这样做可以确保在 Visual Studio 中尝试刷新订阅时不会不断要求输入凭据。在最新版本的 NuGet 包管理器中,使用标准 HTTP 请求获取订阅,并且不使用存储在 nuget.config 中的凭据。

注意事项:

  1. 您不需要第三方解决方案来托管私有、安全的 feeds。NuGet 服务器是免费提供的,而且 IIS 和 NuGet 工具都支持 NTLM/AD/Windows 安全。

  2. 不需要发布到 feed 的开发人员不需要在其配置文件中存储凭据。他们也不需要配置“发布”feed。这只对构建服务器或其他发布者(参见步骤2和3)是必要的。

  3. 所有将使用软件包 feed 的开发人员都会对步骤5感兴趣,这应该是大多数开发人员所需的全部内容。他们可以简单地从 Visual Studio 中添加 feed,然后在提示时输入凭据即可。

  4. 如果凭据更改,您可以导航到“开始”->“管理 Windows 凭据”,然后删除“VSCredentials_nuget.fabrikam.com”。

  5. 步骤2可以在 Visual Studio 中执行,但为了清晰起见,我在此处给出了命令行。但是,步骤3必须通过命令行(或使用 NuGet API)执行。

  6. 在未来的 NuGet 版本中,传言凭据信息可以存储在解决方案或项目级别(细节不明确),这可能仅适用于多租户构建环境中无法访问构建服务器的人员。

希望这能帮助其他人!

这个答案实际上并没有回答问题,它只涉及在客户端设置NuGet,而不是在服务器上设置。它假设问题提出的实际问题(已认证的服务器)已经解决。 - Wilbert
2
这是因为原始SO标题是“配置nuget以使用身份验证”,这是一个常见的问题,但我已经更新了答案,添加了一个IIS身份验证配置的附加步骤,包括一个链接到详细解释身份验证配置的technet参考文章。这个答案应该作为NuGet服务器、构建服务器/发布者和开发人员的完整解决方案。 - Shaun Wilson
所以,如果我按照您的建议在IIS上启用NTLM,只有具有有效AD凭据的人才能从此服务器下载软件包吗? - Wilbert
@Shaun Wilson,非常棒的帖子!非常感谢。虽然步骤2和步骤3的方法在最新版本的Nuget中由于一个错误而无法工作。请参见https://nuget.codeplex.com/workitem/4096?FocusElement=CommentTextBox - Spons
是的,实际上是我创建了那个错误报告,因此我们在构建服务器上保留了NuGet 2.7.x的副本,以执行“nuget push”的目的,但是开发人员工作站当然具有最新的工具(2.8.x),大部分情况下仍适用于开发人员(非发布者)的角度。希望他们能在某个时候修复那个错误,这样我们就可以回到使用最新的nuget.exe来推送软件包。 - Shaun Wilson
我尝试了步骤1-3并设置了用户登录,启用了我的NuGet服务器的Win身份验证,但是当我尝试使用packageSourceCredentials XML NuGet.config中的凭据登录服务器时,仍然无法登录。看起来我的IIS服务器站点与此配置凭据没有连接/信息。我是否在中间缺少某种设置?也许是IIS权限中的配置? - Nazo Tajrian

2

我实际选择的解决方案是使用TeamCity作为NuGet服务器。虽然它缺少nuget push功能,但安装起来有点麻烦,但现在它可以很好地工作,并且不需要额外的费用,只向经过身份验证的用户提供NuGet包。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接