如何替换我的 PAT 以在 .NET Web API 中访问 Azure DevOps API?

问题描述 投票:0回答:1

我有一个 .NET Web API,用于与 Azure DevOps API 交互,以在各种组织和 DevOps 项目的 Azure DevOps 板上创建和更新工作项。目前,我正在使用自己帐户中的个人访问令牌 (PAT) 进行身份验证,但出于显而易见的原因,我想消除使用此 PAT。

我已在 Azure 中注册了一个应用程序,并为其授予了 vso.work_full 权限。我还在我的应用程序中添加了身份验证服务。

public class AzureDevOpsAuthService
{
    private readonly IConfidentialClientApplication _clientApp;

    public AzureDevOpsAuthService(string clientId, string clientSecret, string tenantId)
    {
        _clientApp = ConfidentialClientApplicationBuilder.Create(clientId)
            .WithClientSecret(clientSecret)
            .WithAuthority(new Uri($"https://login.microsoftonline.com/{tenantId}"))
            .Build();
    }

    public async Task<string> GetAccessTokenAsync()
    {
        var result = await _clientApp.AcquireTokenForClient(new[] { "499b84ac-1321-427f-aa17-267ca6975798/.default" }).ExecuteAsync();
        return result.AccessToken;
    }
}

这不起作用,给我以下错误:

Microsoft.VisualStudio.Services.Common.VssServiceException:TF401444:请在 Web 浏览器中以 {CENSORED TENANT ID} 身份至少登录一次,以启用对服务的访问。 在 Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.HandleResponseAsync(HttpResponseMessage 响应,CancellationToken 取消令牌) 在Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.SendAsync(HttpRequestMessage消息,HttpCompletionOption完成选项,对象userState,CancellationToken取消令牌) 在 Microsoft.VisualStudio.Services.WebApi.VssHttpClientBase.SendAsync[T](HttpRequestMessage 消息,对象 userState,CancellationToken CancellationToken) 在 Microsoft.VisualStudio.Services.Location.Client.LocationHttpClient.GetConnectionDataAsync(ConnectOptions connectOptions,Int64 lastChangeId,CancellationToken CancellationToken,Object userState)

我不确定问题是什么。看来我应该将应用程序添加为组织中的用户?但当我尝试添加用户或赋予其贡献者角色时,我似乎找不到它。

问题:

  • 使用具有多租户的 Azure 应用程序是最好的方法,还是有更好的方法?
  • 如何将应用程序作为用户添加到不同的 Azure 租户,以便我可以访问他们的 Azure DevOps Board 来创建和更新工作项?
azure asp.net-web-api azure-devops azure-active-directory azure-api-management
1个回答
0
投票

不确定这是否有帮助,但这就是我所做的。 我有 React 前端客户端和 .net Web API 后端。 在前端,我使用 Microsoft Graph Toolkit 中的登录组件。 https://learn.microsoft.com/en-us/graph/toolkit/components/login?tabs=html

当用户使用该组件登录时。您会注意到该网站上有一个 loginCompleted 事件。 我使用那个 loginCompleted 事件。 将访问令牌传递给我的 .net API 控制器。

 const loginCompleted = async () => {
    setIsLoggingIn(true);
    try {
      const provider = Providers.globalProvider;
      const accessToken = await provider.getAccessToken();
      await login(accessToken);
    } catch (error) {
      console.error('Error getting access token', error);
    }
  };

然后在我的后端调用 microsoft graph me 端点。使用令牌。

  httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", graphToken.Token);
            var response = await httpClient.GetAsync("https://graph.microsoft.com/v1.0/me");

            if (!response.IsSuccessStatusCode) {
                do your thing
              } 
 

我使用响应信息将信息添加到 Microsoft Identity 并将其存储在我的 SQL Server DB 中,并创建我自己的 JWT 令牌,我将其用于应用程序的其余部分,但您可以执行任何您想要的操作。

© www.soinside.com 2019 - 2024. All rights reserved.