2

我想用 NAnt (V0.86.3317.0) 在 SourceGear Vault (V4.1.4) 中执行一些任务。

有什么方法可以让 Vault 使用 NAnt 的 Windows 身份验证来创建连接?

我用来初始化保险库连接的 NAnt 块是:

<target name="InitialiseVaultSettings">
<echo>InitialiseVaultSettings</echo>
<vaultsetloginoptions user="${vault.Username}" password="${vault.Password}" URL="${vault.Host}" repository="${vault.Repository}" />
<vaultsetworkingfolder repositoryFolderPath="${vault.Folder}" diskPath="${vault.WorkingDirectory}" createDiskPath="true" />

由于我正在与其他开发人员一起开发该项目,因此将用户名和密码硬编码到 NAnt 构建文件中并不是一个好主意。username和都是命令password中的必需选项。vaultsetloginoptions

其他替代品(全部带有渔获物)包括:

(a) 将“管理员”帐户硬编码到 NAnt 属性中并使用该帐户登录保险库。这不是很好,因为我们随后松散了谁负责 NAnt 脚本执行的签入/签出操作的审计跟踪。当解决方案签出文件时,它也会导致问题(部分脚本确保在 Vault 中生成标签之前将所有文件签回源代码管理)。

(b) 使用 NAnt 代码中的 C# 脚本来动态设置用户名和密码的属性...除了我们仍然遇到从用户获取密码的问题

(c) 从 Vault 客户端读取存储的配置文件信息并使用它进行连接(除非我不确定它的存储位置)。

4

3 回答 3

3

我对 Vault 不熟悉,所以请原谅这个答案可能含糊不清。我与 NAnt 合作过很多次,任何被执行的东西(任务、执行人员等)都具有在集成身份验证模式下运行的内在潜力。

最后,身份验证会传递给恰好正在运行父 NAnt 进程的任何用户。话虽如此,这可能表明 Vault 的 NAnt 任务不支持集成身份验证?这意味着,如果vaultsetloginoptions任务需要用户和密码参数,那么就没有传递凭据的好方法(正如您所指出的)。

如果碰巧没有解决Vault 的 NAnt 任务可能缺少的解决方法,则可以使用<exec>任务调用其客户端工具的命令行版本(甚至不确定是否有)。如果这是一个选项,只要运行 NAnt 进程的用户与需要连接到 Vault 的用户相同,集成身份验证就会自动启动。

对于我们在构建过程中集成的一些东西,我们必须这样做。我们要么执行到命令行版本,要么通过扩展 NAnt 框架编写了我们自己的任务。不管怎样,这应该是可能的。

更新

在 Vault 论坛上环顾四周,似乎AD 集成只是让 Vault Client 提示用户并将其传递给服务器的一种方式。来自论坛

Vault 客户端将始终提示输入用户名/密码。我们的 AD 集成仅限于验证输入的密码是否与 Active Directory 中的密码匹配的服务器。

因此,客户端没有真正的方式以内置方式传递 Windows 身份验证信息。Vault 客户端程序在 AD 模式下运行时需要输入用户名和密码。可悲的是,如果不存储用户名/密码,无缝集成 NAnt 的可能性很小。

于 2009-05-19T16:44:59.263 回答
1

我已经成功地实现了原型来解决这个问题。

下面描述的解决方法的完整源代码和二进制文件可以在这里找到:

保险柜登录扩展

我创建了一些自定义的 NAnt 任务和功能。

<VaultLogin>检查 Windows 注册表中以前存储的用户名和密码信息。如果未找到,则会使用登录窗口提示用户。它将条目存储在两个函数中并清除注册表(以防登录失败 - 见<SaveVaultLogin>下文):

${VaultLoginFunctions::UserName()}
${VaultLoginFunctions::Password()}

然后该<vaultsetloginoptions>任务可以使用以下功能:

<vaultsetloginoptions user="${VaultLoginFunctions::UserName()}" password="${VaultLoginFunctions::Password()}" URL="${vault.Host}" repository="${vault.Repository}" />

调用<vaultsetloginoptions>任务后,我们再调用<SaveVaultLogin>将用户名和密码值写回注册表的任务。这可确保仅存储成功的身份验证详细信息(因为如果用户名和密码不正确,脚本将在任务中失败。

这是放在一起的代码块:

  <target name="InitialiseVaultSettings">
<echo>InitialiseVaultSettings</echo>

<loadtasks assembly="CompassHealth.NAntExtensions.Tasks.dll" />

<VaultLoginGet />
<echo message="UserName = ${VaultLoginFunctions::UserName()}" />

<vaultsetloginoptions user="${VaultLoginFunctions::UserName()}" password="${VaultLoginFunctions::Password()}" URL="${vault.Host}" repository="${vault.Repository}" />

<vaultsetworkingfolder repositoryFolderPath="${vault.Folder}" diskPath="${vault.WorkingDirectory}" createDiskPath="true" />


<!-- need to save the login here, as it is cleared once VaultLoginGet is called, this ensures that only correct username and password are stored -->
<VaultLoginSave />    

更新:现在在帖子顶部链接到二进制文件和解决方法的源代码。

于 2009-06-14T22:41:13.940 回答
0

在查看 Scott Saad 的建议后,不幸的是,命令行工具中似乎没有选项可以使用 Windows 身份验证来调用它。

我目前的想法与上面的(b)一致。

我将创建一个可以从 Nant 脚本调用的库,询问当前 Windows 用户的 Vault 用户名和密码。

库将在注册表项中查找先前输入的 Vault 用户名并登录此 Windows 用户。如果存在,它将被传递给脚本而无需任何用户交互。

如果此用户名/密码未能通过 Vault 登录,或者它不存在,则库将提供一个对话框供用户输入当前的 Vault 用户名和密码。

用户的条目将存储在注册表中(加密),这意味着每次更改 Vault 用户名和密码时只需输入一次。

不是一个理想的解决方案,但应该是相对简单的并且是可以接受的足够解决方法。

你怎么看?

于 2009-05-31T10:15:40.910 回答