【发布时间】:2017-11-10 09:28:03
【问题描述】:
我已经成功地让我的 ASP.NET (MVC5) 应用程序在服务器端用 C# 读取和写入我们的 VSTS 工作项。
但是,为了获得最佳用户体验,我真的想使用 Ajax 进行一些更新。使用在我自己的帐户下创建的个人访问令牌 (PAT),我已经能够完美地完成这项工作。例如,这很好用:
var vstsAuthHeader = { "Authorization": "Basic " + btoa("" + ":" + "abcd...123") }
function updateRoadmapGroup(featureId, newRoadmapGroup) {
var patchDocument = [{
"op": "replace",
"path": "/fields/CustomScrum.RoadmapGroupID",
"value": newRoadmapGroup
}];
var patchValue = JSON.stringify(patchDocument);
$.ajax({
method: "PATCH",
url: "https://myaccount.visualstudio.com/_apis/wit/workitems/" + featureId + "?api-version=" + apiVersion,
contentType: "application/json-patch+json",
beforeSend: function (xhr) {
xhr.setRequestHeader(vstsAuthHeader);
},
processData: false,
data: patchValue,
error: function (exception) {
console.log(exception);
},
success: function (data) {
}
});
};
一旦它起作用,我认为使用 OAuth 代替我的 PAT 会很容易。类似于将上面列出的代码的第一行更改为:
var vstsAuthHeader = { "Authorization": "Bearer " + btoa("" + ":" + accessToken) }
这不起作用 - 我收到错误“401(未经授权)”,当我深入研究时,完整的错误是:
TF400813:资源不可用于匿名访问。需要客户端身份验证。
我尝试了很多 Ajax 调用的变体,但都没有奏效。我试过添加
beforeSend: function (xhr) {
xhr.setRequestHeader("Authorization", "Bearer " + btoa("" + ":" + accessToken));
},
这似乎更接近我在网上找到的一些类似事情的例子,但不起作用。
我在没有btoa 函数的情况下尝试了上述两种方法,我相信它将令牌转换为Base64,只是使用原始accessToken 值传递。而且我尝试了十几种其他方法,结果总是一样。
我的问题是如何使用 OAuth 不记名令牌更新 Ajax 调用中的 VSTS 项目,就像我可以使用 PAT 一样?
【问题讨论】:
-
您的 VSTS 帐户是否由 Azure AD 支持?并且您的登录电子邮件地址既是工作帐户又是 Microsoft 帐户?
-
这是个好问题。整个“Azure AD 的 VSTS”这件事让我有些困惑,但我查看了它,因为我在 VSTS API 文档中看到了它,并且似乎 VSTS 帐户不是由 Azure AD 支持的。你知道确定的方法吗?我正在为 VSTS 使用 Microsoft 帐户,其中没有工作帐户。 PAT 有效这一事实是否表明我的帐户仍然具有正确的权限?
-
您可以从您的帐户设置中查看(https://account.visualstudio.com/_admin/_home/settings)。不,PAT 的权限是从您的帐户继承的。如果您的帐户没有正确的权限,PAT 将不起作用。
-
如果您使用的是Microsoft Account,401错误页面上的身份应该是这样的“Windows Live ID\yourremailaddress”,请检查这个。
-
@Eddie-MSFT 看来我们的 VSTS 帐户确实得到了 Azure Active Directory 的支持。当我点击 401 页面时,身份是一串字母和数字(如和 SID),而不是我的 Microsoft 帐户用户名。无论如何,使用 AAD 对我们的团队来说太过分了,所以我断开了 VSTS 帐户与 Azure AD 的连接,现在我的 Ajax 调用工作完美!谢谢你的帮助!请随意添加答案,以便我接受。
标签: ajax oauth-2.0 azure-devops azure-devops-rest-api