c# - .Net Core - 使用 AzureAD 身份验证访问 Azure DevOps REST API
问题描述
我正在编写一个 Blazor Web 应用程序来从 Azure DevOps 中提取管道数据。到目前为止,我一直在使用 PAT 进行访问,但我希望用户能够使用他们的 Azure AD 帐户而不是 PAT 进行访问。我已经通过 Microsoft.AspNetCore.Authentication.AzureAD.UI 库添加了 Azure AD 身份验证,因此您必须使用您的 Azure AD 帐户登录才能访问该站点,这很有效。
现在我已经让他们登录了,我想将该登录名用于用于调用 REST API 的 VssConnection。目前我正在使用这样的个人访问令牌:
VssCredentials vssCredentials = new VssBasicCredential(string.Empty, PAT);
VssConnection vssConnection = new VssConnection(new Uri($"https://dev.azure.com/{Org}"), vssCredentials);
如何更改它以利用他们正在使用的 Azure AD 登录名,这样他们就不需要提供 PAT?
更新
我想我真的很接近这一点。我在 Github 上找到了一个名为Microsoft.Identity.Web的库,它似乎可以满足我的要求。我想我只是在努力理解如何使用正确的范围进行调用。所以在我的创业公司中,我现在拥有:
services.AddMicrosoftIdentityPlatformAuthentication(Configuration)
.AddMsal(Configuration, scopes)
.AddInMemoryTokenCaches();
其中“范围”是一个字符串数组。后来我有:
string token = await _tokenAcquisition.GetAccessTokenOnBehalfOfUserAsync(scopes);
其中 _tokenAcquisition 是来自 Microsoft.Identity.Web 的 ITokenAcquisition。同样,范围是一个字符串数组。我不确定我应该为这两个调用使用什么范围。在 Azure 门户中的应用程序注册中,我有
那么我在 Startup 中的调用使用什么范围,以及稍后在调用中使用什么来获取令牌?我已经尝试了很多选项,我什至不能全部提及。有些在启动时调用失败。有些在令牌获取中失败。有些人一直通过,然后告诉我我无法访问 dev.azure.com。任何帮助将不胜感激。
解决方案
目前,Azure DevOps 不为 Asp.net Core Web 应用提供 OAuth 库。您可以参考以下链接中的退出身份验证示例:
但是,我们可以按照Authorize access to REST APIs with OAuth 2.0 自己实现 OAuth 2.0。您需要在网页上放置一个登录按钮,并通过您为 Azure DevOps 注册的应用程序编写授权请求,并处理响应并获取访问令牌。之后,您可以使用令牌调用 Azure DevOps REST。
Azure DevOps 的 OAuth 与使用 Azure AD 的身份验证不同,它是由 Azure DevOps 直接提供的单独 OAuth。下面是 Azure DevOps 和 Azure AD 之间不同的授权和令牌 url:
Azure DevOps ( OAuth 2.0 )
授权网址: https ://app.vssps.visualstudio.com/oauth2/authorize
访问令牌 URL: https ://app.vssps.visualstudio.com/oauth2/token
Azure AD(OAuth 代码授予流程)
授权网址: https ://login.microsoftonline.com/ {tenant}/oauth2/authorize
访问令牌 URL: https ://login.microsoftonline.com/ {tenant}/oauth2/token
如果您喜欢 Microsoft 为 Asp.net Core 提供身份验证库和代码示例,我建议您投票并留下您对来自 Asp.Net Core 应用程序 (3.0) 的 DevOps 的 oAuth的反馈。
推荐阅读
- mysql - 如何将“YYYYMM”格式转换为“YYYY-MM-00”?
- ios - iOS 14 上的 Metal 崩溃
- javascript - 无限 Ajax jQuery 错误,在窗口滚动时加载更多(重复数据)问题
- graph - 如何基于 Voronoi 图构建图形?
- mysql - 将嵌套的 Json 插入 MySQL 表
- css - 我将如何整合这些 CSS 类?
- python - 从 Python 目录中的多个 CSV 文件中提取特定列
- python-3.x - 迭代单击并返回主页,但无法使用 Python Selenium 转到下一页
- python - Python Selenium 给定一个元素,使用 element.find_element 查找直接子元素下面的元素
- java - 如何通过id组合两个对象列表并在kotlin中选择非空值