Аутентификация с помощью VSTS / TFS

Я обновляю приложение C#, которое общается с TFS/VSTS, чтобы использовать последнюю версию TeamFoundation SDK.

Я хотел бы подключиться и запросить учетные данные в приложении так же, как это делает Visual Studio, если вы используете это для подключения к TFS.

Я скачал последнюю стабильную VSTS Api с nuget.org, которая:

microsoft.teamfoundationserver.extendedclient.15.112.1.nupkg

Я также ссылаюсь на сборки, которые он использует из моей установки VS2017, здесь:

C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\CommonExtensions\Microsoft\TeamFoundation\Team Explorer,

Я попробовал несколько комбинаций, но не могу получить подсказку. Мой текущий код выглядит так:

    static void Main(string[] args)
    {
        try
        {
            var netCred = new NetworkCredential();
            var basicCred = new VssBasicCredential(netCred);
            var vssCred = new VssCredentials(basicCred);
            vssCred.PromptType = CredentialPromptType.PromptIfNeeded;
            var server = new TfsTeamProjectCollection(new Uri(serverName), vssCred);
            server.Authenticate();
        }
        catch( Exception ex )
        {
            System.Console.WriteLine(ex.ToString());
        }

        System.Console.ReadKey();
    }

Он не запрашивает, а вместо этого выводит это исключение:

Microsoft.TeamFoundation.TeamFoundationServerUnauthorizedException: TF30063: Вы не авторизованы для доступа по https://.visualstudio.com/. ---> System.Net.WebException: удаленный сервер возвратил ошибку: (401) не авторизован. в System.Net.HttpWebRequest.GetResponse() в Microsoft.TeamFoundation.Client.Channels.TfsHttpWebRequest.SendRequestAndGetResponse(HttpWebRequest webRequest, WebException и webException.). Конец внутреннего исключения.TfsHttpWebRequest.SendRequest() в Microsoft.TeamFoundation.Client.Channels.TfsHttpRequestChannel.Request(сообщение TfsMessage, тайм-аут TimeSpan) в Microsoft.TeamFoundation.Clinel.Channels.Tec ] и выводы)
в Microsoft.TeamFoundation.Framework.Client.LocationWebService.Connect(функции Int32 connectOptions, Int32 lastChangeId, Int32) в Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.Connect(ConnectOptions connectOptionsamraid.Fraid.Fraid.Fraid.Fraction.FidServerFirectoryFile.FR). () в Microsoft.TeamFoundation.Client.TfsConnection.Authenticate() в VstsAuthTest.Program.Main(String[] args) в S:\VstsAuthTest\Program.cs: строка 26

Как мне заставить его запрашивать и кэшировать учетные данные?

Старая версия dll TeamFoundation SDK, которую я использовал, похоже, работала нормально. Причина, по которой я обновляюсь, заключается в том, что приложение C#, по-видимому, отказывается подключаться к TFS, когда установлено на машине только с VS2017, а не с VS2015. Я надеялся, что обновление до последней версии SDK поможет решить проблему с подключением.


Я видел это, но кажется устаревшим и использует классы, которые сейчас устарели. Речь также идет о подключении без приглашения, но в комментариях обсуждается, как получить приглашение.

https://blogs.msdn.microsoft.com/buckh/2013/01/07/how-to-connect-to-tf-service-without-a-prompt-for-liveid-credentials/

Я также видел эти образцы, которые появляются недавно, но также используют устаревший API.

https://www.visualstudio.com/en-us/docs/integrate/get-started/client-libraries/samples

1 ответ

Просто используйте пакет расширенного клиента Microsoft Team Foundation Server с VssClientCredentials.

Простой код:

using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.WebApi;
using Microsoft.VisualStudio.Services.Client;
using Microsoft.VisualStudio.Services.WebApi;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TFSAPIConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var u = new Uri("https://XXX.visualstudio.com");
            TfsTeamProjectCollection collection = new TfsTeamProjectCollection(u, new VssClientCredentials());

            collection.Authenticate();
            Console.WriteLine(collection.Name);
            Console.Read();

        }
    }
}
Другие вопросы по тегам