TFS REST API 授权
TFS REST API Authorization
通过 C# 控制台应用程序和 TFS 2015 更新 3 请求 TFS REST API 时获取 "Unauthorized" 状态代码。
大家好,
我正在尝试使用 C# 控制台应用程序控制 TFS(2015 更新 3)REST API。
在我的旧应用程序中,我引用了 Microsoft.VisualStudio.Build.Client
(等)库,并且可以通过 TfsTeamProjectCollection
访问我需要的信息。老实说,我不知道身份验证的来源。也许通过 Windows 凭据或与 Visual Studio 关联的帐户。无论如何,我不必在我的应用程序中指定凭据。
但我没有找到 REST API 的示例,我无需特别授权。
我找到了一个使用 .NET 客户端库的示例,该客户端库通过 VssCredentials(使用 NTLM)对自身进行授权。我也不必在此处指定用户名或密码:
VssConnection connection = new VssConnection(new Uri(URL), new VssCredentials());
这也行,但我无法获得所需的所有信息,所以我想自己控制 REST API。
有人可以给我一个示例,说明如何在没有单独的 username/password 的情况下访问 REST API 吗?或者这不再可能了?
谢谢
约翰内斯
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
using (HttpResponseMessage response = await client.GetAsync("http://ServerName:8080/tfs/CollectionName/ProjectName/_apis/build/builds/BuildID"))
{
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
}
我希望得到 json 响应,但我只得到未经授权的异常。
我也将 HttpClient 与 pat 或 username/password 一起使用。我已经使用默认凭据进行了测试,并且得到了 401。然后我发现了这个 post:
我已经使用 WebClient 创建了示例并且它有效:
WebClient wc = new WebClient();
wc.UseDefaultCredentials = true;
wc.Headers.Add("Content-Type", "application/json");
var data = wc.OpenRead("http://my-srv:8080/tfs/DefaultCollection/MyProject/_apis/build/builds/MyId?api-version=3.0");
var response = new StreamReader(data).ReadToEnd();
您需要将 HttpClientHandler()
添加到您的 HttpClient
:
using (HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }))
{
// ...
}
正如 Shamrai Aleksander 所说,您可以使用 WebClient 默认凭据,或者,您可以使用 TFS 安全创建自定义 PAT 并限制用户访问。
请在此处找到有关 TFS PAT 的更多信息:https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops
通过 C# 控制台应用程序和 TFS 2015 更新 3 请求 TFS REST API 时获取 "Unauthorized" 状态代码。
大家好,
我正在尝试使用 C# 控制台应用程序控制 TFS(2015 更新 3)REST API。
在我的旧应用程序中,我引用了 Microsoft.VisualStudio.Build.Client
(等)库,并且可以通过 TfsTeamProjectCollection
访问我需要的信息。老实说,我不知道身份验证的来源。也许通过 Windows 凭据或与 Visual Studio 关联的帐户。无论如何,我不必在我的应用程序中指定凭据。
但我没有找到 REST API 的示例,我无需特别授权。
我找到了一个使用 .NET 客户端库的示例,该客户端库通过 VssCredentials(使用 NTLM)对自身进行授权。我也不必在此处指定用户名或密码:
VssConnection connection = new VssConnection(new Uri(URL), new VssCredentials());
这也行,但我无法获得所需的所有信息,所以我想自己控制 REST API。
有人可以给我一个示例,说明如何在没有单独的 username/password 的情况下访问 REST API 吗?或者这不再可能了?
谢谢 约翰内斯
using (HttpClient client = new HttpClient())
{
client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
using (HttpResponseMessage response = await client.GetAsync("http://ServerName:8080/tfs/CollectionName/ProjectName/_apis/build/builds/BuildID"))
{
response.EnsureSuccessStatusCode();
string responseBody = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseBody);
}
}
我希望得到 json 响应,但我只得到未经授权的异常。
我也将 HttpClient 与 pat 或 username/password 一起使用。我已经使用默认凭据进行了测试,并且得到了 401。然后我发现了这个 post:
我已经使用 WebClient 创建了示例并且它有效:
WebClient wc = new WebClient();
wc.UseDefaultCredentials = true;
wc.Headers.Add("Content-Type", "application/json");
var data = wc.OpenRead("http://my-srv:8080/tfs/DefaultCollection/MyProject/_apis/build/builds/MyId?api-version=3.0");
var response = new StreamReader(data).ReadToEnd();
您需要将 HttpClientHandler()
添加到您的 HttpClient
:
using (HttpClient client = new HttpClient(new HttpClientHandler() { UseDefaultCredentials = true }))
{
// ...
}
正如 Shamrai Aleksander 所说,您可以使用 WebClient 默认凭据,或者,您可以使用 TFS 安全创建自定义 PAT 并限制用户访问。 请在此处找到有关 TFS PAT 的更多信息:https://docs.microsoft.com/en-us/azure/devops/organizations/accounts/use-personal-access-tokens-to-authenticate?view=azure-devops