【问题标题】:Authenticate with VSTS / TFS使用 VSTS / TFS 进行身份验证
【发布时间】:2017-12-23 05:01:15
【问题描述】:

我正在升级一个与 TFS/VSTS 对话的 C# 应用程序以使用最新的 TeamFoundation sdk。

我想连接并让应用提示输入凭据,就像使用 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: 您无权访问 https://.visualstudio.com/。 ---> System.Net.WebException: 远程服务器返回错误:(401)未经授权。在 System.Net.HttpWebRequest.GetResponse() 在 Microsoft.TeamFoundation.Client.Channels.TfsHttpWebRequest.SendRequestAndGetResponse(HttpWebRequest webRequest, WebException& webException) --- 内部异常结束 堆栈跟踪 --- 在 Microsoft.TeamFoundation.Client.Channels.TfsHttpWebRequest.SendRequest() 在 Microsoft.TeamFoundation.Client.Channels.TfsHttpRequestChannel.Request(TfsMessage 消息,TimeSpan 超时)在 Microsoft.TeamFoundation.Client.Channels.TfsHttpClientBase.Invoke(TfsClientOperation 操作、Object[] 参数、TimeSpan 超时、Object[]& 输出)
在 Microsoft.TeamFoundation.Framework.Client.LocationWebService.Connect(Int32 connectOptions,Int32 lastChangeId,Int32 功能)在 Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.Connect(ConnectOptions 连接选项)在 Microsoft.TeamFoundation.Framework.Client.FrameworkServerDataProvider.Authenticate() 在 Microsoft.TeamFoundation.Client.TfsConnection.Authenticate() 在 VstsAuthTest.Program.Main(String[] args) 在 S:\VstsAuthTest\Program.cs:第 26 行

如何让它提示和缓存凭据?

我使用的旧版本的 TeamFoundation sdk dll 似乎可以正常工作。我升级的原因是因为 C# 应用程序在安装在只有 VS2017 而不是 VS2015 的机器上时似乎拒绝连接到 TFS。我希望升级到最新的 SDK dll 可能有助于解决连接问题。


我见过这个,但它似乎已经过时并且使用了现在已弃用的类。这也是关于没有提示的连接,但 cmets 包含一些关于如何获得提示的讨论。

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

【问题讨论】:

  • 您应该切换到引用 VSTS/TFS API SDK 的 NuGet 包并将 dll 打包到您的产品中。不再支持依赖 Visual Studio 安装。

标签: tfs azure-devops azure-devops-rest-api


【解决方案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();

        }
    }
}

【讨论】:

  • 这对我来说似乎没问题,但是我收到了一些使用该代码的人的日志报告,他们仍然遇到同样的问题。 Authenticate() 引发了我在问题中提到的异常,并且不会显示凭据提示。这些用户可以登录 VSTS 门户网站,并可以正常连接 Visual Studio。
  • 你的意思是即使在连接到 Visual Studio 之后他们也有问题?尝试在凭据管理器中清除相关凭据,同时清除 TFS\VSTS 的缓存(路径喜欢 C:\Users\XXX\AppData\Local\Microsoft\Team Foundation)
  • 是的,这就是我的意思,清除凭据管理器和 Team Foundation 缓存没有任何区别。我在没有安装 VS 的系统和安装了 VS2015 和 VS2017 的系统上成功测试了该工具(使用上述代码)。显然他们只是安装了 VS2015。这是我目前能想到的唯一区别。
  • 如果您在代码中指定该用户的帐户,它可以连接到 TFS/VSTS 吗?
  • 我有一种感觉,这可能取决于架构......如果应用程序以 32 位运行,它似乎更可靠。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-17
相关资源
最近更新 更多