Интегрированная аутентификация Nant, Vault и Windows

Я хочу выполнить ряд задач в SourceGear Vault (V4.1.4) с Nant (V0.86.3317.0).

Есть ли способ заставить Vault использовать проверку подлинности Windows от Nant для создания соединения?

Блок 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) Используйте скрипт C# из кода Nant для динамической установки свойств имени пользователя и пароля... за исключением того, что у нас возникла проблема с получением пароля от пользователя до сих пор

(c) Считайте информацию о сохраненном профиле из клиента Vault и подключитесь с помощью этого (за исключением того, что я не уверен, где она хранится).

Спасибо за внимание.

3 ответа

Решение

Я успешно реализовал прототип, чтобы обойти эту проблему.

Полный исходный код и двоичные файлы для обходного пути, описанного ниже, можно найти здесь:

Расширения Vault

Я создал несколько пользовательских задач и функций.

<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 />    

Обновление: ссылка на двоичные файлы и источник для обхода теперь в верхней части сообщения.

Я не знаком с Убежищем, поэтому, пожалуйста, простите потенциальную неопределенность этого ответа. Я много работал с NAnt, и все, что выполняется (задачи, execs и т. Д.), Имеет потенциал для работы в интегрированном режиме аутентификации.

В конце концов, аутентификация передается тому, кто запускает родительский процесс NAnt. При этом это может быть признаком того, что задачи Vault в Vault не поддерживают интегрированную аутентификацию? Это означает, что если для задачи vaultsetloginoptions требуются аргументы пользователя и пароля, то нет хорошего способа передачи учетных данных (как вы указали).

Если нет никаких обходных путей для потенциала, которого не хватает в задачах Vault в NAnt, возможно, можно будет использовать <exec> Задача вызвать версию командной строки своего клиентского инструмента (даже не уверен, что он у них есть). Если это опция, встроенная аутентификация автоматически включается, если пользователь, выполняющий процесс NAnt, совпадает с пользователем, которому необходимо подключиться к Vault.

Нам пришлось сделать это для нескольких вещей, с которыми мы интегрируемся в процесс сборки. Мы либо выполнили exec'd для версии командной строки, либо написали свои собственные задачи, расширив инфраструктуру NAnt. В любом случае, это должно быть возможно.

Обновить

Некоторые осматривались на форумах Vault, и кажется, что интеграция AD - это просто способ заставить Vault Client запрашивать пользователя и передавать его на сервер. С форума:

Клиент Vault всегда запрашивает имя пользователя / пароль. Наша интеграция с AD ограничивается проверкой того, что введенный пароль совпадает с паролем в Active Directory.

Таким образом, у клиента нет истинного способа передать информацию о проверке подлинности Windows встроенным способом. Клиентская программа Vault требует ввода имени пользователя и пароля при работе в режиме AD. К сожалению, казалось бы, без сохранения имени пользователя и пароля шансы на бесшовную интеграцию с NAnt - это далеко.

Взглянув на предложение Скотта Саада, к сожалению, в инструменте командной строки, похоже, нет возможности вызвать его с помощью проверки подлинности Windows.

Мое текущее мышление соответствует (б) выше.

Я создам библиотеку, которую можно вызывать из сценария Nant с запросом имени пользователя и пароля для текущего пользователя Windows.

Библиотека будет искать в записи Resigstry ранее введенное имя пользователя Vault и логин для этого пользователя Windows. Если он существует, он будет передан в сценарий без какого-либо взаимодействия с пользователем.

Если это имя пользователя / пароль не удается войти в хранилище или если оно не существует, библиотека предоставит пользователю диалоговое окно для ввода текущего имени пользователя и пароля в хранилище.

Запись пользователя будет храниться в реестре (в зашифрованном виде), поэтому ее нужно вводить только один раз при каждом изменении имени пользователя и пароля в Vault.

Не идеальное решение, но оно должно быть относительно простым и достаточно приемлемым.

Как вы думаете?

Другие вопросы по тегам