问题描述
问题:
“无法在“主页/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)"))
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”不起作用,我可能错过了什么?真的会感谢社区的帮助
解决方法
此问题的可能原因是您没有更改调用 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
,
有 2 个设置管理系统访问令牌的权限。默认情况下,它的权限在一定程度上受到限制,以防止人们滥用管道来执行他们无法执行的操作。
- 管道上的项目/集合设置会将访问令牌限制为管道的父项目或整个项目集合/Azure DevOps 组织。
- 服务帐号的权限。这取决于您在 1 中选择的设置。对于项目范围,使用:
Your-project-name Build Service (your-collection-name)
,对于集合范围:Project Collection Build Service (your-collection)
。
您可以将上述帐户添加到安全组以授予其额外权限。
见: