从 c# 身份验证异常访问 tfs

Posted

技术标签:

【中文标题】从 c# 身份验证异常访问 tfs【英文标题】:accessing tfs from c# authentication exception 【发布时间】:2016-04-05 14:03:29 【问题描述】:

我正在尝试通过 c# 代码访问 TFS 服务器,并且在此问题中继续运行。 仅当我尝试调试代码时才会出现此问题,但如果我只是尝试构建并运行它就会成功。

var credentials = new NetworkCredential("username","password");
var projects = new TfsTeamProjectCollection(new Uri("http://xxx-xxxx.com:8080/tfs/xxxxx"), credentials);
    projects.EnsureAuthenticated();

    if (Directory.Exists(localPath))
    
         foreach (var item in Directory.GetFiles(localPath, "*.*", SearchOption.AllDirectories))
         
             File.SetAttributes(item, FileAttributes.Normal);
         
             Directory.Delete(localPath, true);
    


WorkingFolder[] mapping = serverItem.Select(x => new WorkingFolder(x, Path.Combine(localPath, GetDummyString(x)))).ToArray();

var workspace = versionControl.CreateWorkspace(workspaceName, Environment.UserName, Environment.UserName + " Checkout", mapping);
workspace.Get();

它发生在projects.EnsureAuthenticated(); 通话中。我明白了:

System.Net.WebException occurred:
  HResult=-2146233079
  Message=The remote server returned an error: (401) Unauthorized.
  Source=System
  StackTrace: at System.Net.HttpWebRequest.GetResponse()
  InnerException: null

它仅在我尝试调试时发生,如果我评论该行,我会收到一个新的 webException 说:Additional information: The remote server returned an error: (401) Unauthorized. from the call to versionControl.CreateWorkspace()

更新: 我注意到当它在调试时抛出异常时,如果我尝试继续(多次单击 F10)异常消失并且代码成功。

更新 2: 在为这个问题苦苦挣扎了一段时间之后,似乎我收到此错误的问题是因为在我创建对象时某些属性没有被初始化。如图所示: Link here

从图中可以看出,初始化失败的是 AuthorizedIdentity 和 CatalogNode。知道如何解决吗?

【问题讨论】:

这是在 ASP.NET Web 应用程序的上下文中吗? 不,我正在使用桌面控制台应用程序。我正在尝试通过控制台应用程序与 tfs 建立连接,该应用程序稍后将作为类库建立。 您收到HTTP 401 响应,这意味着该请求尚未应用,因为它缺少目标资源的有效身份验证凭据。我看到您没有在任何地方添加 NetworkCredential,所以如果可以的话,我建议您添加到 projects。否则我不太确定你应该在哪里添加它,但无论如何这都是一种方法 我会尝试,虽然我知道这给了我一个不同的异常(必须复制它才能再次获得异常)。另一方面,还有一个问题——为什么只有在缺少凭据的情况下才进行调试? 我将上面的代码更改为:var credentials = new NetworkCredential("UserName","Password"); var projects = new TfsTeamProjectCollection(new Uri("http://xxx-xxxxxx.com:8080/tfs/xxxxxxx"), credentials);,但仍然给出相同的异常。 【参考方案1】:

添加域字符串将摆脱这个问题:

  var credentials = new NetworkCredential("Username", "Password", "Domain");
  var projects = new TfsTeamProjectCollection(new Uri("http://tfsserver:8080/tfs/teamprojectcollection"), credentials);
  projects.EnsureAuthenticated();

【讨论】:

对于域我​​可以使用Environment.UserDomainName 吗?如果是,那并不能解决问题,因为当我添加它并尝试调试时,它会在下一步出现异常projects.EnsureAuthenticated() (same webException: the remote server returned an error: (401) Unauthorized) 我已经尝试过 var credentials = new NetworkCredential("Domain\Username", "Password"),但不起作用。使用 var credentials = new NetworkCredential("Username", "Password", "Domain") 有效。 您是要运行代码还是调试?我正在通过单元测试项目执行此代码 sn-p,如果我只是尝试运行,它全是绿色的,但是如果我尝试调试,它总是在 EnsureAuthenticated 调用时崩溃... 实际上我注意到的是当它抛出异常时,如果我尝试继续(F10 多次)异常消失并且代码成功并继续.. 我调试代码。如果我使用 var credentials = new NetworkCredential("Domain\Username", "Password"),我会得到异常“TeamFoundationServerUnauthorizedException was unhandled”和信息“TF30063: You are not authorized to access tfsserver:8080/tfs/teamprojectcollection”。如果我使用 var credentials = new NetworkCredential("Username", "Password", "Domain"),则不会出现异常或信息。顺便说一句,我使用 VS 2015 Update1 + TFS 2015 Update2。

以上是关于从 c# 身份验证异常访问 tfs的主要内容,如果未能解决你的问题,请参考以下文章

无法从 C# 中的客户端(控制台应用程序)从 WCF 服务(已通过 Windows 身份验证)访问 SQL Server

无法根据访问令牌对用户进行身份验证 - MS Graph API C#

在 C# 中复制具有身份验证的文件

在 C# 中复制具有身份验证的文件

在 TFS2013 中使用 Git 进行 Kerberos 身份验证

使用 ASP.NET 和 TFS api 的直通(模拟)身份验证