【问题标题】:TFS Build agent throws "unauthorized" exceptionTFS 构建代理引发“未经授权”异常
【发布时间】:2016-11-27 11:20:57
【问题描述】:

我们已将 TFS 2013 服务器升级到 TFS 2015,并且正在设置新的构建代理。

在此之前,我们进行了试运行,并在对现有 TFS 数据库进行最终转换之前使一切正常运行。构建代理运行良好。

令我们惊讶的是,我们的构建代理在升级后不再合作。创建一个简单的构建定义并将其分配给默认队列会导致在 10-15 秒后引发错误。

我们尝试重新部署构建代理,尝试使用权限和用户,但无济于事。

我们在 _diag\ 日志中得到的只是这个:

11:18:09.699993 JobManager.StartJob(job.JobId = a9702f31-2dff-4057-8253-a32ebc106f32)
11:18:09.699993 JobInfo.ctor
11:18:09.699993 JobInfo.ctor - leave
11:18:09.699993 JobManager.StartJob - calling JobWriter.StartJob
11:18:09.699993 JobWriter.StartJob - enter
11:18:09.699993 JobWriter.StartJob - (SKIPPING)first renew
11:18:09.715619 JobWriter.StartJob - start continual renewing
11:18:09.715619 AuthorizationType : OAuth
11:18:09.731245 ---------------------------------------------------------------------------
11:18:09.731245 Microsoft.VisualStudio.Services.WebApi.VssServiceResponseException: Unauthorized
11:18:09.731245    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.HandleResponse(HttpResponseMessage response)
11:18:09.731245    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__79.MoveNext()
11:18:09.731245 --- End of stack trace from previous location where exception was thrown ---
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
11:18:09.731245    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__76`1.MoveNext()
11:18:09.731245 --- End of stack trace from previous location where exception was thrown ---
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
11:18:09.731245    at Microsoft.VisualStudio.Services.Location.Client.LocationHttpClient.<GetConnectionDataAsync>d__6.MoveNext()
11:18:09.731245 --- End of stack trace from previous location where exception was thrown ---
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
11:18:09.731245    at Microsoft.VisualStudio.Services.Client.VssServerDataProvider.<ConnectAsync>d__39.MoveNext()
11:18:09.731245 --- End of stack trace from previous location where exception was thrown ---
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
11:18:09.731245    at Microsoft.TeamFoundation.DistributedTask.Agent.Common.ConnectionHelper.GetConnection(Uri serverUri, VssCredentials credentials)
11:18:09.731245    at Microsoft.TeamFoundation.DistributedTask.Agent.JobWriter.StartJob()
11:18:09.731245    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.HandleResponse(HttpResponseMessage response)
11:18:09.731245    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__79.MoveNext()
11:18:09.731245 --- End of stack trace from previous location where exception was thrown ---
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
11:18:09.731245    at Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.<SendAsync>d__76`1.MoveNext()
11:18:09.731245 --- End of stack trace from previous location where exception was thrown ---
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
11:18:09.731245    at Microsoft.VisualStudio.Services.Location.Client.LocationHttpClient.<GetConnectionDataAsync>d__6.MoveNext()
11:18:09.731245 --- End of stack trace from previous location where exception was thrown ---
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
11:18:09.731245    at Microsoft.VisualStudio.Services.Client.VssServerDataProvider.<ConnectAsync>d__39.MoveNext()
11:18:09.731245 --- End of stack trace from previous location where exception was thrown ---
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
11:18:09.731245    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
11:18:09.731245    at Microsoft.TeamFoundation.DistributedTask.Agent.Common.ConnectionHelper.GetConnection(Uri serverUri, VssCredentials credentials)
11:18:09.731245    at Microsoft.TeamFoundation.DistributedTask.Agent.JobWriter.StartJob()
11:18:09.731245 ---------------------------------------------------------------------------

以交互方式运行或作为服务运行没有区别。我已将构建代理的服务用户登记为“代理池服务帐户”角色的成员。

我认为这是有问题的请求:

GET https://tfs:8443/tfs/DefaultCollection/_apis/connectionData?connectOptions=IncludeServices&lastChangeId=-1&lastChangeId64=-1 HTTP/1.1
User-Agent: VSServices/14.102.25423.0 (VsoAgent.exe) VsoAgent.exe/1.95.3
Accept-Language: en-US, nb-NO
X-TFS-FedAuthRedirect: Suppress
X-TFS-Session: 7a2e6368-a564-4231-bbd6-xxxxxxxxxx
X-VSS-Agent: VSS: b5d9c453-017f-407c-ac00-b479d0d0e8ed
Authorization: [huge bytesequence]
Host: tfs:8443
Accept-Encoding: gzip

这得到了 401 的奖励。但是我自己的管理员用户能够很好地加载这个 URI。

我自己的管理员用户是我设置代理时使用的用户。我也尝试过从这个用户交互地启动 vsoagent.exe ......但不行。在字里行间阅读(并查看一些角色),有一个用户暴露了运行代理的机器的名称。我猜这个用户是最初创建的,并且是实际使用的用户。我该如何控制这种情况?

编辑:如果我从未包含在池的“代理池服务帐户”列表中的用户以交互方式运行 vsoagent.exe,则代理会立即出错并显示 Access denied. admrunem needs Listen permissions for pool Regular to perform the action. For more information, contact the Team Foundation Server administrator.。将 admrunem 添加到列表中让我更进一步,即我试图诊断的错误消息(“未经授权的”异常)。注意:此时它使用 NTLM 授权,然后对于致命调用似乎切换到 OAUTH。

【问题讨论】:

    标签: tfs tfsbuild tfs-2015


    【解决方案1】:

    检查是否在 Team Foundation Server IIS 网站上启用了“Windows 身份验证”。这为我们解决了问题。

    【讨论】:

    • 是的!感谢分享。这对我们也有用。将更新我在问题上看到的其他一些线程,希望能将人们引向这个方向。
    【解决方案2】:
    1. 确保运行代理的帐户处于“代理池服务帐户”角色中。

    2. 确保在集合中配置了队列 (https://your-tfs-server:8080/tfs/your-collection/_admin/_AgentQueue)。如果不是 - 选择“新队列..”并选择现有队列。

    3. 确保完全按照 this article 部署 Windows 构建代理。
    4. 尝试更改属于“构建代理服务帐户”组成员且属于“代理池服务帐户”角色的域帐户,以查看代理是否可以工作。

    【讨论】:

    • 我不完全理解您所说的“尝试更改域帐户”是什么意思。您的意思是作为不同的域用户运行 vsoagent? vsoagent /登录:用户,密码?如果是这样,那么我已经尝试了您列表中的每个项目两次。知道 JobWriter.StartJob() 做什么吗?我尝试了反射器,但无法完全理解它到达 HandleResponse() 的位置,它会引发异常。 “未经授权”是一个相当模糊的错误消息。我假设它来自 TFS 服务器。有没有审计日志可以给我任何有用的线索?
    • 为了清楚起见,“构建代理服务帐户”是指集合的“项目集合构建服务帐户”组吗? (顺便说一句,这个组不是为我的项目定义的,只是包含我的项目的集合)
    • 是的。尝试在 Build Agent Service Accounts 和 Agent Pool Service Account 中使用一个帐户。
    • 我感觉涉及三个不同的用户:1)运行 ConfigureAgent.cmd 脚本的用户 2)vsoagent /login:user,password 用户用于覆盖 1)设置时的用户启动服务 3) 运行 vsoagentservice 的 windows 服务用户 所以...通常,在配置阶段我可以指定管理员用户 (2) 并且小脚本将联系我的 tfs 服务器并确保构建代理的用户(大概是服务用户 3) 是否已加入相关角色?
    • 查看我最近的编辑。如果我的用户不包含在服务帐户角色中,那么 vsoagent 甚至不会开始监听(因为它不能)。这里还有其他东西在起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 2019-03-11
    • 2012-02-22
    • 2014-07-01
    • 1970-01-01
    相关资源
    最近更新 更多