Azure devops API用户无权访问此资源

a14dhokn  于 2023-05-29  发布在  其他
关注(0)|答案(3)|浏览(198)

我试图得到一个简单的API样本项目的工作。什么都不起作用,因为我总是得到同样的错误:TF 400813:未授权用户“b370 c683-bb 42 - 626 c-9a 85-ec 3a 81 c32 fbf”访问此资源。",
我能够从www.example.com获得令牌micrsoftonline.com,但我猜这可能是Azure门户或Azure Devops中的设置问题。所有的文档都是100%无用的,因为来自https://learn.microsoft.com/en-us/rest/api/azure/devops/?view=azure-devops-rest-7.1的每一个文档都有4年前的样本!它们都不起作用,并且有几个演练相互冲突。我一直在尝试将服务主体链接到azure应用程序注册。我以为我已经做到了,但是每次我运行示例代码,或者尝试postman,每次都是同样的错误。
我在Postman中使用以下代码:

获取请求如下:
https://dev.azure.com/{Organization}/_apis/projects?api-version=7.0
虽然,我几乎从来没有使用过Rest API,所以这可能是不正确的,但总是得到相同的错误:

示例代码来自这里:https://github.com/microsoft/azure-devops-dotnet-samples
4年前,哈哈,可能过时了哦,顺便说一下,我正在使用Azure 30天试用版,并且刚刚注册了Azure DevOps。但没有提到任何限制。使用azure作为一个应用程序注册点来自动化azure devops中的任务不会这么难吧?
你知道可能出了什么问题吗?
谢谢你。

e5njpo68

e5njpo681#

我通过下载以下代码示例成功地让它工作起来:https://github.com/microsoft/azure-devops-auth-samples/tree/master/OAuthWebSample
这个项目中有一个自述文件,解释了在哪里以及如何注册你的azure devops应用程序。在这种情况下不需要Azure Portal。
代码中有一个错误,但是,您需要将index.cshtml页面中的/oauth/requesttoken更改为/oauth/authorize
另外,您需要在项目中添加对System.Runtime.Serialization的引用,因为没有该引用可能无法编译。
另外,请确保只使用几个作用域进行测试,因为创建应用程序所使用的作用域必须与web. config中使用的作用域完全匹配。
您也可以按照以下文档手动进行调用:https://learn.microsoft.com/en-us/azure/devops/integrate/get-started/authentication/oauth?view=azure-devops#2-authorize-your-app,但这是一个多一点的工作。您需要手动创建REST调用。
另外,Azure和Azure devops有一个主要的缓存/传播问题,因为我让一切都完美地工作,或者我认为,但一直得到401错误。所以,半个小时后我回来了,什么也没做,效果很好。你可能会或可能不会遇到这个问题。
此外,当您调用rest API时,使用以下格式:GET https://dev.azure.com/{organization}/_apis/projects?api-version=7.0(这将获取组织中的所有项目作为示例。)有几个误导性的示例,如果您不是RESTMaven,这将是痛苦的。

xqnpmsa8

xqnpmsa82#

看起来你正在使用不记名令牌,但根据文档,你应该使用PAT。
如何生成PAT here
您可以从此处了解有关身份验证here的更多信息

编辑1:正如上面评论中提到的,你也可以尝试将授权类型从基本改为承载。
编辑2:我们可以使用rest API使用oauth,就像在this文档中提到的那样。
按照this创建应用程序。

9cbw7uwe

9cbw7uwe3#

或者,您也可以使用以下步骤从Azure AD获取bearer token,以调用DevOps API。
我注册了一个Azure AD应用程序并授予DevOps API permission如下:

现在,我在应用中选择**Web平台添加了重定向URI**,如下所示:

由于权限类型为Delegated,需要使用授权码流、交互流、用户名密码等Delegated流…用于生成访问令牌。
获取授权码,可在获取令牌前在浏览器中运行以下授权请求:

https://login.microsoftonline.com/<tenantID>/oauth2/v2.0/authorize
?client_id=<appID>
&response_type=code
&redirect_uri=http://localhost
&response_mode=query
&scope=499b84ac-1321-427f-aa17-267ca6975798/.default
&state=12345

当我在浏览器中运行上述请求时,我在地址栏中成功得到**code**值,如下所示:

我通过Postman使用授权码流成功生成了访问令牌,在下面的请求中包含了上面的代码:

POST https://login.microsoftonline.com/<tenantID>/oauth2/v2.0/token
grant_type:authorization_code
client_id: <appID>
client_secret: <secret>
scope: 499b84ac-1321-427f-aa17-267ca6975798/.default
code: <paste_code_from_above_request>
redirect_uri: http://localhost

回复:

当我用这个token调用DevOps API时,我成功地得到了组织中的项目列表,如下所示:

GET https://dev.azure.com/<Organization>/_apis/projects?api-version=7.0

回复:

更新:

我克隆了这个**GitHub sample,通过在Public Client(移动的& desktop)**平台添加重定向URI注册了一个Azure AD应用程序,如下所示:

添加DevOpsAPI权限后,我修改了**App.config**文件值,包括clientId、tenantId和组织URL,如下所示:

当我运行示例时,打开了一个新窗口以登录,如下所示:

登录成功后,我在控制台得到了项目列表的响应,如下所示:

相关问题