Программный доступ к TFS 2010 из-за пределов домена

Я пытаюсь программно получить доступ к моему серверу TFS из-за пределов домена, в котором установлен сервер. Базовая тестовая программа будет выглядеть так :

class Program
    {
        static void Main(string[] args)
        {
            Uri tfsUri = new Uri("");
            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("");
            TfsConfigurationServer _ConfigurationServer = new TfsConfigurationServer(tfsUri, new NetworkCredential("", ""));
            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("", "", "");
        }

        public void NotifyCredentialsAuthenticated(Uri uri)
        {
            throw new ApplicationException("Unable to authenticate");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            string _myUri = @"";

            ConnectByImplementingCredentialsProvider connect = new ConnectByImplementingCredentialsProvider();
            ICredentials iCred = new NetworkCredential("", "", "");
            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("", "", ""))
            {
               Uri tfsUri = new Uri("");
               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: // : 8080 / tfs или http: // : 8080 / tfs (оба протестированы, с обновленным файлом hosts) который установлен как URL-адрес уведомления на сервере TFS. Эта программа работает внутри домена.

DifferentKindOfUsernames может быть любым из 'DOMAIN \ Username', 'LocallyDuplicatedUsername', 'LOCALMACHINE \ Username' с соответствующим паролем, одинаковый пароль в домене и на машине.

Этот простой доступ не работает вне домена, и у меня есть эта ошибка :

TF30063: You are not authorized to access 

переведено в веб-контексте (с использованием того же процесса на веб-сайте asp.net), это ошибка 401:

The remote server returned an error: (401) Unauthorized.

даже если (пока что проверено):

  • У меня есть сопоставление между локальными пользователь / пароль, который запускает программу на компьютере постороннего домена, и учетная запись активного каталога, имеющая доступ администратора к TFS (даже с активированными правами олицетворения в TFS).
  • Я добавляю раздел реестра BackConnectionNames с именем машины постороннего домена и IP, как описано здесь .
  • Я отключаю проверку обратной связи, как описано здесь .
  • Я использую имитатор Active Directory с другой комбинацией имени пользователя / домена или имени машины. Active Directory Impersonator описывается здесь .
  • Я добавил IP-адрес сервера TFS в локальную интернет-зону (также попробовал доверенный сайт) в параметрах безопасности IE внешнего сервера домена, как описано здесь .

Я протестировал доступ к serverURI из браузера. URI работает, и у меня есть доступ к коллекции TFS, если я дам учетные данные с помощью DomainName \ User + Password. Я тестировал это перед любой из описанных мною ранее модификаций. Интересно, в чем может быть разница между программным доступом и доступом через браузер, помимо всего того, что я тестировал до сих пор.

6
задан Matthieu 29 September 2011 в 21:09
поделиться