Аутентификация с помощью 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 поможет решить проблему с подключением.
Я видел это, но кажется устаревшим и использует классы, которые сейчас устарели. Речь также идет о подключении без приглашения, но в комментариях обсуждается, как получить приглашение.
Я также видел эти образцы, которые появляются недавно, но также используют устаревший 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();
}
}
}