【问题标题】:TfsTeamProjectCollection does not ask for credentialTfsTeamProjectCollection 不要求提供凭据
【发布时间】:2019-09-13 10:50:57
【问题描述】:

亲爱的

请帮我解决 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 
    }

我尝试在Autheticate() 之前添加vssCred.Storage = new VssClientCredentialStorage();,但没有成功

然后我使用 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(和加载项)和控制台。没有提升的权限。

当 TfsConnection 用作 VS 插件时,我能做些什么吗?

【问题讨论】:

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


    【解决方案1】:

    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();
    

    尽管它被标记为过时。

    【讨论】:

    • 我收到另一个报告,TfsClientCredentialsVssClientCredentials 都无法在第三台计算机上运行。所以现在在我的机器上,两者都在工作,第二台计算机只有TfsClientCredentials 可以工作,第三台计算机的两个凭据都无法连接(出现 401 错误)O_o。所有计算机均使用具有自动更新功能的 Windows 10 Prof 和最新的 VS 2017
    猜你喜欢
    • 2013-01-13
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多