在Azure中使用基于角色的授权时,如何允许服务帐户访问REST API?

时间:2019-09-13 01:04:48

标签: azure rest authorization azure-devops-rest-api service-principal

摘要::我有一个用于功能测试的REST API。我只允许具有特定“测试人员”角色的人员或小组访问API。我想在Azure DevOps发布管道中自动触发此功能测试,但是我不知道如何授权机器帐户访问API。

详细信息:

我已使用[Authorize(Roles =“ Tester”)]]保护此API

    [Route("quotas/developers")]
    [HttpGet]
    [Authorize(Roles = "Tester")]
    [SwaggerResponse(HttpStatusCode.OK, "Successful operation", Type = typeof(DeveloperQuota[]))]
    public async Task<List<DeveloperQuota>> GetDeveloperQuota([FromUri]string developerUpn)

要进行设置,我在Azure Active Directory中注册了一个企业应用程序。在清单中,我声明了角色。

enter image description here

然后在企业应用程序中添加一些用户和组,这些用户和组被分配了角色“ Tester”。

enter image description here

这对于手动运行我的功能测试很好。我运行测试,它会弹出一个oauth对话框供我输入凭据,它从成功的身份验证请求中获取我的Bearer令牌,然后将其传递给API。

    private string GetActiveDirectoryToken()
    {
        string authority = this.configuration.ActiveDirectoryAuthority;
        string resource = this.configuration.ActiveDirectoryAudience;
        string keyVaultUri = this.configuration.KeyVaultUri;

        IKeyVaultAdapterFactory keyVaultAdapterFactory = new KeyVaultAdapterFactory();
        var keyVaultAdapter = keyVaultAdapterFactory.CreateInstance(KeyVaultServicePrincipal.PowerShellAppId);

        SecureString clientIdSecure = keyVaultAdapter.GetAzureKeyVaultSecretSecure(keyVaultUri, "GasCallbackRegistrationClientID", null).Result;
        SecureString redirectUriSecure = keyVaultAdapter.GetAzureKeyVaultSecretSecure(keyVaultUri, "GasCallbackRegistrationClientIDRedirectUri", null).Result;

        var authContext = new AuthenticationContext(authority);
        var result = authContext.AcquireTokenAsync(
            resource,
            SecureStringUtilities.DecryptSecureString(clientIdSecure),
            new Uri(SecureStringUtilities.DecryptSecureString(redirectUriSecure)),
            new PlatformParameters(PromptBehavior.Auto)).Result;

        return result.AccessToken;
    }

当然,如果我在自动化过程中运行此程序,则不会在对话框中填充信用凭证,也不想存储这些信用凭证的副本,尤其是由于这些信用凭证按时间表滚动时,在其他地方维护。

我的想法是,我可以创建一个Azure服务主体,将证书与服务主体相关联,将证书安装在我的部署计算机上,如果证书可用,则以服务主体身份登录,然后将该服务主体放入“测试员”的角色。问题是我无法在企业应用程序中将服务主体添加为用户。它似乎只允许我添加“用户和组”。同样,我无法将服务主体添加到组中。

enter image description here

关于如何授权我的部署箱访问这些API的任何想法?

1 个答案:

答案 0 :(得分:2)

为应用程序发布的角色被视为application permissions,不能通过“用户和组”分配屏幕分配给其他应用程序。

要将应用程序权限分配给客户端应用程序,请转到客户端应用程序的注册页面,依次单击Api PermissionsAdd a Permission。选择My Api标签,搜索发布了应用程序角色的应用程序,您将在下面的列表中看到该应用程序角色。选择它,保存,然后grant admin consent