TfsTeamProjectCollection不要求提供凭据

时间:2019-04-24 07:55:27

标签: tfs visual-studio-2017 azure-devops add-in

亲爱的

请帮助我解决VS外接Tfs连接问题。

我编写了VS 2017插件,该插件使用TfsTeamProjectCollection类连接到tfs服务器。 Tfs服务器托管在https://dev.azure.com

但是,在某些计算机上,它无法连接到Tfs服务器。 例如,我尝试重现此问题,并清除了所有描述为here的缓存。清除/连接几个周期后,我得到了以下信息:

  • 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应用程序检查了网络数据包。 它显示了使用单元测试,控制台应用程序和加载项发送的相同请求数据包。 但是控制台应用程序和单元测试会产生初始请求

  

开机自检   https://dev.azure.com/quipu-cwnet/Services/v3.0/LocationService.asmx   HTTP / 1.1

响应为

  

HTTP / 1.1 401未经授权

     

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

然后,控制台和单元测试将数据包发送到重定向URL,并询问用户凭据。

当加载项尝试连接到Tfs服务器时,提琴手仅显示第一个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(和加载项)和控制台。没有提升的权限。

用作VS外接程序时,TfsConnection有什么可以做的吗?

1 个答案:

答案 0 :(得分:0)

the answer将在单独的线程(非GUI)中执行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();

尽管已将其标记为过时。

相关问题