Я пытаюсь получить программный доступ к своему серверу TFS из-за пределов домена, в котором установлен сервер. Базовая тестовая программа будет выглядеть так:
class Program
{
static void Main(string[] args)
{
Uri tfsUri = new Uri("<serverUri>");
TfsConfigurationServer _ConfigurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);
CatalogNode projectCollectionCatalog = _ConfigurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)[0]; // actual connection tries to happen here
}
}
Другая версия с принудительными учетными данными:
class Program
{
static void Main(string[] args)
{
Uri tfsUri = new Uri("<serverURI>");
TfsConfigurationServer _ConfigurationServer = new TfsConfigurationServer(tfsUri, new NetworkCredential("<DifferentKindOfUsernames>", "<Password>"));
CatalogNode projectCollectionCatalog = _ConfigurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)[0];
}
}
Другая версия, сочетающая обе предыдущие версии:
public class ConnectByImplementingCredentialsProvider : ICredentialsProvider
{
public ICredentials GetCredentials(Uri uri, ICredentials iCredentials)
{
return new NetworkCredential("<DifferentKindOfUsernames>", "<Password>", "<DomainOrNot>");
}
public void NotifyCredentialsAuthenticated(Uri uri)
{
throw new ApplicationException("Unable to authenticate");
}
}
class Program
{
static void Main(string[] args)
{
string _myUri = @"<serverUri>";
ConnectByImplementingCredentialsProvider connect = new ConnectByImplementingCredentialsProvider();
ICredentials iCred = new NetworkCredential("<DifferentKindOfUsernames>", "<Password>", "<DomainOrNot>");
connect.GetCredentials(new Uri(_myUri), iCred);
TfsConfigurationServer configurationServer =
TfsConfigurationServerFactory.GetConfigurationServer(new Uri(_myUri), connect);
configurationServer.EnsureAuthenticated();
}
}
И версия с активным каталогом Impersonator:
class Program
{
static void Main(string[] args)
{
using (new Impersonator("<DifferentKindOfUsernames>", "<DomainOrNot>", "<Password>"))
{
Uri tfsUri = new Uri("<serverUri>");
TfsConfigurationServer _ConfigurationServer = TfsConfigurationServerFactory.GetConfigurationServer(tfsUri);
CatalogNode projectCollectionCatalog = _ConfigurationServer.CatalogNode.QueryChildren(new[] { CatalogResourceTypes.ProjectCollection }, false, CatalogQueryOptions.None)[0]; // actual connection tries to happen here
}
}
}
serverURI
имеет форму http://<servername>:8080/tfs
или http://<serverip>:8080/tfs
(оба протестированы, с обновленным файлом hosts), который установлен как URL-адрес уведомления на сервере TFS. Эта программа работает внутри домена.
DifferentKindOfUsernames
может быть любым из 'DOMAIN \ Username', 'LocallyDuplicatedUsername', 'LOCALMACHINE \ Username' с соответствующим паролем, паролем, одинаковым в домене и на машине.
Этот простой доступ не будет работать вне домена, и у меня такая ошибка:
TF30063: You are not authorized to access <serverUri>
переведенный в веб-контексте (с использованием того же процесса на веб-сайте asp.net), это ошибка 401:
The remote server returned an error: (401) Unauthorized.
даже если (пока что проверено):
- У меня есть сопоставление между локальным пользователем / паролем, который запускает программу на компьютере постороннего домена, и учетной записью активного каталога, у которой есть доступ администратора к TFS (даже с активированными правами олицетворения в TFS).
- Я добавляю
BackConnectionNames
раздел реестра с именем компьютера постороннего домена и IP, как описано здесь. - Я отключаю проверку обратной связи, как описано здесь.
- Я использую имитатор Active Directory с другой комбинацией имени пользователя / домена или машины. Описание имитатора Active Directory можно найти здесь.
- Я добавил IP-адрес сервера TFS в локальную интернет-зону (также попробовал доверенный сайт) в параметрах безопасности IE внешнего сервера домена, как описано здесь.
Я протестировал доступ к serverURI из браузера. URI работает, и у меня есть доступ к коллекции TFS, если я предоставлю учетные данные с помощью DomainName \ User + Password. Я тестировал это перед любой из описанных мною ранее модификаций. Интересно, в чем может быть разница между программным доступом и доступом через браузер, помимо всего того, что я тестировал до сих пор.
http://
и номер порта, правильно? - person qJake   schedule 30.09.2011/tfs
? В моем коде TFS, который подключается к серверу интрасети, этого нет (библиотека может добавить его автоматически). - person qJake   schedule 30.09.2011