2017-07-18 85 views
0

我正在升級與TFS/VSTS通信以使用最新的TeamFoundation sdk的C#應用​​程序。使用VSTS/TFS進行身份驗證

我想以Visual Studio的相同方式連接並獲得應用程序提示輸入憑據,如果您使用它連接到TFS。

我已經下載從nuget.org最新的穩定VSTS API,它是:

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: You are not authorized to access https://.visualstudio.com/. ---> System.Net.WebException: The remote server returned an error: (401) Unauthorized. at System.Net.HttpWebRequest.GetResponse() at Microsoft.TeamFoundation.Client.Channels.TfsHttpWebRequest.SendRequestAndGetResponse(HttpWebRequest webRequest, WebException& webException) --- End of inner exception stack trace --- at Microsoft.TeamFoundation.Client.Channels.TfsHttpWebRequest.SendRequest() at Microsoft.TeamFoundation.Client.Channels.TfsHttpRequestChannel.Request(TfsMessage message, TimeSpan timeout) at Microsoft.TeamFoundation.Client.Channels.TfsHttpClientBase.Invoke(TfsClientOperation operation, Object[] parameters, TimeSpan timeout, Object[]& outputs)
at Microsoft.TeamFoundation.Framework.Client.LocationWebService.Connect(Int32 connectOptions, Int32 lastChangeId, Int32 features) at Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.Connect(ConnectOptions connectOptions) at Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.Authenticate() at Microsoft.TeamFoundation.Client.TfsConnection.Authenticate() at VstsAuthTest.Program.Main(String[] args) in S:\VstsAuthTest\Program.cs:line 26

我如何得到它的提示和緩存憑據?

我使用的TeamFoundation sdk dll的舊版本似乎工作正常。我升級的原因是因爲C#應用程序似乎拒絕連接到TFS安裝在只有VS2017而不是VS2015的機器上。我希望升級到最新的SDK dll可能有助於解決連接問題。


我已經看到了這一點,但它似乎已經過時,並使用了現在過時的類。這也是關於沒有提示的連接,但是評論包括一些關於如何獲得提示的討論。

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

+0

您應該切換到引用NuGet包的VSTS/TFS API SDK,並與您的產品包裝DLL的。不再支持依賴於Visual Studio安裝。 – jessehouwing

回答

1

只要使用Microsoft Team Foundation Server Extended Client package與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(); 

     } 
    } 
} 
+0

這似乎對我來說確實很好,但是我收到了幾個使用此代碼的工具的日誌報告,他們仍然遇到同樣的問題。 Authenticate()拋出我在問題中提到的異常,並且它們沒有顯示提示輸入憑據。這些用戶可以登錄到VSTS門戶網站,並且可以很好地與Visual Studio連接。 –

+0

即使與Visual Studio連接後,你的意思是他們有問題嗎?嘗試清除憑證管理器中的相關憑證,並清除TFS \ VSTS的緩存(路徑類似C:\ Users \ XXX \ AppData \ Local \ Microsoft \ Team Foundation) –

+0

是的,這就是我的意思,並清除憑證管理器和Team Foundation緩存沒有任何區別。我在沒有安裝VS的系統上,以及安裝了VS2015和VS2017的系統上成功測試了該工具(使用上面的代碼)。顯然,他們只是安裝了VS2015。這是我現在能想到的唯一區別。 –