TfsTeamProjectCollection не запрашивает учетные данные - PullRequest
0 голосов
/ 24 апреля 2019

Dears

Пожалуйста, помогите мне с вопросом о подключении VS к Tfs.

Я написал плагин VS 2017, который использует TfsTeamProjectCollection для подключения к серверу TFS. Сервер Tfs размещен в https://dev.azure.com

Однако на некоторых компьютерах не удается подключиться к серверу Tfs. Например, я попытался воспроизвести это и очистил все кэши, как описано здесь . После очистки / соединения нескольких циклов у меня получилось следующее:

  • VS Team Explorer подключен к Tfs. Я могу оформить заказ / проверить файлы, загрузить историю и т. Д.
  • Моя надстройка не может подключиться с ошибкой 401 без авторизации.
  • Тест единства, запущенный VS, может подключаться к тем же Tfs с использованием того же кода
  • Я создал пример консольного приложения, которое использует для подключения точно такой же класс и метод из надстройки, и оно тоже работает.

Вот исходный код, который я использую для подключения:

public override TfsTeamProjectCollection CreateCollection(WorkspaceInfo wi)
{
    var s = (overrideConfig ?? Config);

    var u = wi.ServerUri;
    var vssCred = new VssClientCredentials(); // GetCredentials(s.Vsts);
    Logger.Debug("getting collection for url:{0}", u);
    TfsTeamProjectCollection tpc = null;
    try
    {
        tpc = new TfsTeamProjectCollection(u, vssCred);
        Logger.Debug("authenticating");

        tpc.Authenticate(); // 401 non authorized exception here 
    }

Я пытался добавить vssCred.Storage = new VssClientCredentialStorage(); до Autheticate(), но не повезло

Затем я проверил сетевые пакеты с помощью приложения Fiddler. Он показывает, что тот же пакет запроса отправляется с использованием модульного теста, консольного приложения и надстройки. Но консольное приложение и юнит-тест выдают начальный запрос

POST https://dev.azure.com/quipu-cwnet/Services/v3.0/LocationService.asmx HTTP / 1.1

и ответ

HTTP / 1.1 401 Несанкционированный

X-ТПО-FedAuthRedirect: https://app.vssps.visualstudio.com/_signin?realm=dev.azure.com&reply_to=https%3A%2F%2Fdev.azure.com%2F...

Затем консоль и модульный тест отправляют пакет на URL перенаправления и запрашивают учетные данные пользователя.

Когда надстройка пытается подключиться к серверу Tfs, Fiddler показывает только первый запрос POST и ответ 401 (с тем же заголовком X-TFS-FedAuthRedirect. Но перенаправление отсутствует. Со стороны пользователя это выглядит как зависание приложения для некоторых период после получения ответа 401, который затем завершается с ошибкой 401.

Сборки модульного тестирования и надстроек имеют одинаковые ссылки на сборки 15.0.0, такие как Microsoft.TeamFoundation.VersionControl.Client и связанные с ними.

Я пробовал VssConnection, но тот же

VssConnection connection = new VssConnection(u, vssCred);
connection.ConnectAsync().SyncResult();

var prj = connection.GetClient<ProjectHttpClient>();
var prjCollection = prj.GetProjects().Result; // 401 error here when is executed as VS add-in

foreach (var pc in prjCollection)
    Logger.Debug("\tVssConnection project {0} {1}", pc.Id, pc.Name);

Я использую того же пользователя для запуска VS (и надстройки) и консоли. Нет повышенных разрешений.

Могу ли я что-нибудь сделать с TfsConnection при использовании в качестве надстройки VS?

1 Ответ

0 голосов
/ 25 апреля 2019

ответ - выполнить Authenticate() в отдельном потоке (без графического интерфейса пользователя): crazy

var authTask = Task.Run(() => tpc.Authenticate());
authTask.Wait();

Обратите внимание, что я использую VS 2017 15.9.11 и Microsoft.TeamFoundationServer.ExtendedClient.15.112.1

upd1: Я обновил Microsoft.TeamFoundationServer.ExtendedClient до 15.113.1, он работает на моем компьютере, но все еще не работает на моем коллегном компьютере.

Учетные данные Tfsработают как брелок на обеих машинах:

var tfsClientCredentials = TfsClientCredentials.LoadCachedCredentials(wi.ServerUri, false, false);

var res = new TfsTeamProjectCollection(wi.ServerUri, tfsClientCredentials);
res.EnsureAuthenticated();

несмотря на то, что он помечен как устаревший.

...