在守护程序应用程序或长时间运行的任务中调用Azure DevOps REST API

时间:2019-01-07 22:03:09

标签: azure-devops azure-active-directory

我正在编写Azure WebJob(长时间运行的任务)以实用地创建WorkItems。我创建了Azure AD应用(SPN),并在API权限下添加了Visual Studio Team Services。我创建了控制台应用程序来测试API,这是获取令牌并调用DevOps API的代码

static async Task RunAsync()
{
    AuthenticationContext authContext = new AuthenticationContext(authority); // https://login.microsoftonline.com/{tanent}
    ClientCredential clientCredential = new ClientCredential(clientId, appKey); // Azure APP ID and Key
    AuthenticationResult result = await authContext.AcquireTokenAsync(resourceId, clientCredential); // 499b84ac-1321-427f-aa17-267ca6975798

    httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);

    HttpResponseMessage response = await httpClient.GetAsync(baseAddress + "/_apis/wit/workitemtypes?api-version=5.1-preview.2"); // https://dev.azure.com/{org}/{project}

    if (response.IsSuccessStatusCode)
    {
        string s = await response.Content.ReadAsStringAsync();
        Console.WriteLine(s);
    }
}

我正在获取标题为“ Azure DevOps Services |登录”的HTML输出,而不是JSON响应(工作项类型列表)。由于它是后台进程,因此我无法要求用户提示登录。我可以这样吗?支持吗?

2 个答案:

答案 0 :(得分:1)

您正在使用Azure DevOps REST API的默认身份验证,并且它正在使用OAuth 2.0身份验证模型。

出于您自己的需要,从Azure DevOps登录中消除回调和OAuth身份验证,请改用Azure DevOps PAT(个人访问令牌)。

为将调用API的帐户创建PAT,并根据以下Microsoft的官方文档调整用于调用REST API的代码: Create Azure DevOps Personal Access Token

答案 1 :(得分:0)

  

我可以这样吗?支持吗?

答案是

在需要对Azure Devops服务的权限期间,我们会发现不支持应用程序权限,唯一的方法是委托权限。需要登录用户。有关Azure AD权限类型的更多信息,请参考此document

  

委派的权限-由具有登录用户的应用使用。对于这些应用程序,用户或管理员都同意该应用程序请求的权限,并且在调用API时,该应用程序被委派了作为登录用户的权限。根据API的不同,用户可能无法直接同意API,而是需要管理员提供“管理员同意”。

enter image description here

正如Eriawan Kusumawardhono提到的那样,您可以使用PAT方法来调用Azure DevOps REST API。有关更多信息,您可以参考此document