Я пытаюсь выполнить автоматическое взаимодействие с TFS Online (например, Visual Studio Online). При написании и тестировании кода на моей машине разработки это успешно связано:
creds = new Credentials(userName, password);
tfsConfig = TfsConfigurationServerFactory.GetConfigurationServer(new Uri(vsoUrl), creds);
tfsConfig.EnsureAuthenticated();
Класс полномочий:
public class Credentials : ICredentialsProvider
{
string _userName;
string _password;
public Credentials(string userName, string password)
{
_userName = userName;
_password = password;
}
public ICredentials GetCredentials(Uri uri, ICredentials failedCredentials)
{
return new NetworkCredential(_userName, _password);
}
public void NotifyCredentialsAuthenticated(Uri uri)
{
throw new NotImplementedException();
}
}
Затем я пошел развернуть код и запустить его под учетной записью службы, я получил эту ошибку:
Microsoft.TeamFoundation.TeamFoundationAuthenticationRedirectionException: TF30064: у вас нет доступа к серверу.
в
Microsoft.TeamFoundation.Client.TfsConnection.ThrowAuthorizationException (исключение e)
в
Microsoft.TeamFoundation.Client.TfsConnection.UseCredentialsProviderOnFailure (действие, Int32-попытки, булевский throwOnFailure)...
Поэтому после многих попыток решения я попытался передать неправильный "пароль" на своем локальном тестовом компьютере, и он все еще подключен отлично! Поэтому я могу только предположить, что я не правильно устанавливаю учетные данные в коде, и успешные локальные тесты связаны с тем, что я уже подключен к Visual Studio.
Может ли кто-нибудь понять это или определить, что я делаю неправильно?
Я думаю, что причина, по которой она работает на вашей машине dev, заключается в том, что ваши действительные скейденции уже кэшированы, поэтому ваш CredentialsProvider вообще не вызывается.
Конструктор TfsConfigurationServer, принимающий ICredentialsProvider, помечен как устаревший в документации MSDN. Я бы рекомендовал использовать тот, который принимает ICredentials в качестве ввода (здесь). Код будет выглядеть так:
var userCreds = new NetworkCredential(userName, password);
var tfsServer = new TfsConfigurationServer(new Uri(vsoUrl), userCreds);
tfsServer.EnsureAuthenticated();
Другой вариант - использовать класс TfsTeamProjectCollection вместо TfsConfigurationServer.