【发布时间】:2019-07-21 17:25:49
【问题描述】:
我正在尝试使用我的 TFS 2015 Update 3(本地)提供的其余 API 更改工作项的状态。 当我尝试获取我的项目列表时,一切正常:
var client = new RestClient(uri);
client.Authenticator = new HttpBasicAuthenticator(this.TFSUsername, this.SecurityToken);
var request = new RestRequest(Method.GET);
request.AddHeader("cache-control", "no-cache");
IRestResponse response = client.Execute(request);
在我得到这个答案并获得所需的所有信息后,我将更新其中一个工作项的状态。
使用相同的方法(当然还有相同的凭据),我得到了 401 状态代码,因为我试图匿名这样做。
唯一的区别是我使用动词 PATCH(正如文档所说我必须这样做),并且我正在传递一个正文来确定我想要编辑的状态。
这是我用于编辑的代码:
var client = new RestClient(uri);
client.Authenticator = new HttpBasicAuthenticator(this.TFSUsername, this.SecurityToken);
var request = new RestRequest(Method.PATCH);
request.AddHeader("cache-control", "no-cache");
string body = @"
{
'op':'add',
'path':'/fields/System.State',
'value':'Closed'
}";
request.AddJsonBody(body);
IRestResponse response = client.Execute(request);
关于为什么只是更改 HTTP VERB 会导致我出现此授权问题的任何提示?
尝试使用 Postman 执行此操作会导致我遇到同样的问题。
更新:
查看响应头,我注意到了这一点:
X-TFS-ProcessId →e2b98235-1d3a-4bb7-868f-0d91805aa307
ActivityId →08909688-ac81-4c37-9cea-b47e84fd3efe
X-TFS-Session →08909688-ac81-4c37-9cea-b47e84fd3efe
X-VSS-E2EID →08909688-ac81-4c37-9cea-b47e84fd3efe
X-FRAME-OPTIONS →SAMEORIGIN
WWW-Authenticate →Basic realm="http://xxxxxxx/tfs"
WWW-Authenticate →Negotiate
WWW-Authenticate →NTLM
X-Powered-By →ASP.NET
P3P →CP="CAO DSP COR ADMa DEV CONo TELo CUR PSA PSD TAI IVDo OUR SAMi BUS DEM NAV STA UNI COM INT PHY ONL FIN PUR LOC CNT"
Lfs-Authenticate →NTLM
X-Content-Type-Options →nosniff
Date →Thu, 28 Feb 2019 00:20:57 GMT
Content-Length →0
引起我注意的是:
WWW-Authenticate →Basic realm="http://xxxxxxx/tfs"
WWW-Authenticate →协商
WWW-身份验证→NTLM
因此它将支持基本身份验证作为 Get,但不起作用。 “协商”和“NTLM”是否会以某种方式干扰?
谢谢
【问题讨论】:
-
您是否使用个人访问令牌进行身份验证?如果是这样,请仔细检查令牌是否具有读取和写入/更新权限。
-
感谢@JMarlow,但个人访问令牌已经拥有所有权限