无法检索“主页/Page1/Page2/SpecificPage”中的 Azure Wiki 页面。返回的 HTTP 代码是“404”

时间:2021-03-01 16:54:08

标签: azure-devops azure-pipelines azure-devops-rest-api azure-repos

问题:

“无法在“主页/Page1/Page2/SpecificPage”中检索 Azure Wiki 页面。返回的 HTTP 代码是“404”。”

发生这种情况时:

将 Wiki 从 Azure DevOps Server 2020 迁移到“Azure DevOps Services”。 当使用完全相同的作业/任务执行管道时,在对包含相关信息的 wiki 执行 REST API 调用时输出此错误。

提供和应用的解决方案:

为“Azure DevOps Groups”启用大量权限 从“Wiki Security”启用大量权限

影响:

阻止我们向 Azure DevOps 服务迁移 管道在尝试从管道中检索数据时卡住

满足 ADO 服务的新 API 主体:

Write-Host "$($env:SYSTEM_TEAMFOUNDATIONSERVERURI)"
Write-Host "$($env:SYSTEM_TEAMPROJECTID)"
Write-Host "$(wiki-identifier)"
Write-Host "$(all-sites-wiki-page-path)"
Write-Host Set authorization headers
$Header = @{
Authorization = 'Bearer ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($env:SYSTEM_ACCESSTOKEN)"))
}
$params = @{ 
'Uri' = 'https://dev.azure.com/MyCollection/MyProject/_apis/wiki/wikis/MyWikiIdentifier.wiki/pages?path=Home%20Page%2FMy%20Wiki%2FPage%2FSubpage&includeContent=true&api-version=5.0'
'Headers' = $Header
'Method' = 'GET'
'ContentType' = 'application/json; charset=ASCII.GetBytes'
}
Write-Host Invoke REST API
$Response = Invoke-RestMethod @params
Write-Host $Response

作为免责声明,我确实使用 Bearer 和 Basic 测试了代码的 Header 部分都失败了:

Authorization = 'Bearer ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($env:SYSTEM_ACCESSTOKEN)"))

Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($env:SYSTEM_ACCESSTOKEN)"))

带有“Bearer”的错误输出:

enter image description here

带有“基本”的错误输出:

Invoke-RestMethod : {"$id":"1","innerException":null,"message":"TF401019: The Git repository with name or identifier
0ea73a5d-4187-69c6-af49-d9a4573733ta does not exist or you do not have permissions for the operation you are 
attempting.","typeName":"Microsoft.TeamFoundation.Git.Server.GitRepositoryNotFoundException, 
Microsoft.TeamFoundation.Git.Server","typeKey":"GitRepositoryNotFoundException","errorCode":0,"eventId":3000}
At F:\AzureAgents\ServicesAgent01\_work\_temp\12319456-e600-1234-a872-dd6ed49e758f.ps1:18 char:13
$Response = Invoke-RestMethod @params
       ~~~~~~~~~~~~~~~~~~~~~~~~~
CategoryInfo          : InvalidOperation:
(System.Net.HttpWebRequest:HttpWebRequest) [Invoke-RestMethod], WebException
FullyQualifiedErrorId : WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

关于这张票的最新消息:

发现错误来自持久值“SYSTEM_ACCESSTOKEN” 我确实为 PAT 进行了更改,并且身份验证在“检索 wiki 内容”方面运行良好,但为了简化我们的代码,最好在我们所有的数据中使用持久数据管道而不是 PAT,所以为了做到这一点,需要授予哪些安全值,以便“SYSTEM_ACCESSTOKEN”在 ADO 服务中工作?

这里是我们当前的安全权限:

管道安全:

Build_Administrators 2

Project_Administrators 3

Project_Collection_Administrators 4

Project_Collection_Build_Administrators 5

Project_Collection_Build_Service 6

在集合安全级别,我的用户属于: “集合名称管理员”。因此我应该在所有项目中传播权限

持久数据令牌“env:SYSTEM_ACCESSTOKEN”不起作用,我可能错过了什么?真的会感谢社区的帮助

2 个答案:

答案 0 :(得分:0)

此问题的可能原因是您没有更改调用 wiki 页面的 REST API。

在 Azure DevOps Server 中,REST API Pages - Get 是:

GET https://{instance}/{collection}/{project}/_apis/wiki/wikis/{wikiIdentifier}/pages?api-version=5.0

在 Azure DevOps 服务中,REST API Pages - Get Page 是:

GET https://dev.azure.com/{organization}/{project}/_apis/wiki/wikis/{wikiIdentifier}/pages?api-version=6.0

答案 1 :(得分:0)

有 2 个设置管理系统访问令牌的权限。默认情况下,它的权限在一定程度上受到限制,以防止人们滥用管道来执行他们无法执行的操作。

  1. 管道上的项目/集合设置会将访问令牌限制为管道的父项目或整个项目集合/Azure DevOps 组织。
  2. 服务帐号的权限。这取决于您在 1 中选择的设置。对于项目范围,使用:Your-project-name Build Service (your-collection-name),对于集合范围:Project Collection Build Service (your-collection)

您可以将上述帐户添加到安全组以授予其额外权限。

见:

相关问题