【问题标题】:TFS rest api authorizing GET but not PATCHTFS rest api 授权 GET 但不是 PATCH
【发布时间】: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,但个人访问令牌已经拥有所有权限

标签: c# rest tfs


【解决方案1】:

经过大量尝试,我发现解决方案非常简单。

从身份验证的角度来看,要使其工作,使用 NtlmAuthenticator(带有用户名和密码)而不是 HttpBasicAuthenticator(即使正在为 get 工作)就足够了。 我用 NtlmAuthenticator 替换了我的身份验证器来获取和修补,现在工作正常。

var client = new RestClient(uri);
client.Authenticator = new NtlmAuthenticator(this.TFSUsername, this.TFSPassword);

我发现的另一个棘手的部分(与身份验证没有精确关联)是 PATCH 的内容类型必须是 application/json-patch+json

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-14
    相关资源
    最近更新 更多