Я пытаюсь программно получить доступ к моему серверу 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: //
или http: //
(оба протестированы, с обновленным файлом 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.
даже если (пока что проверено):
BackConnectionNames
с именем машины постороннего домена и IP, как описано здесь . Я протестировал доступ к serverURI из браузера. URI работает, и у меня есть доступ к коллекции TFS, если я дам учетные данные с помощью DomainName \ User + Password. Я тестировал это перед любой из описанных мною ранее модификаций. Интересно, в чем может быть разница между программным доступом и доступом через браузер, помимо всего того, что я тестировал до сих пор.