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

How can I allow a service account to access my REST API when using Roles-based Authorization in Azure?

总结: 我有一个用于功能测试的 REST API。我只允许具有特定 "Tester" 角色的人或团体点击 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 中注册了一个企业应用程序。在清单中,我声明了角色。

然后在企业应用程序中,我添加了一些分配了角色 "Tester."

的用户和组

这非常适合 运行手动进行功能测试。我 运行 测试,它弹出一个 oauth 对话框让我输入我的凭据,它从成功的 auth 请求中获取我的 Bearer 令牌,然后将它传递给 APIs。

    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 服务主体,将证书与服务主体相关联,在我的部署计算机上安装证书,如果证书可用,则以服务主体身份登录,然后将该服务主体放入在 "Tester" 角色中。问题是我无法在企业应用程序中将服务主体添加为用户。它似乎只允许我添加 "Users and groups." 我同样无法将服务主体添加到组中。

关于如何授权我的部署框命中这些 API 有什么想法吗?

为应用程序发布的角色被视为 application permissions,不能通过 "Users and Groups" 分配屏幕分配给其他应用程序。

要将应用程序权限分配给客户端应用程序,请转到客户端应用程序的注册页面,单击 Api Permissions,然后单击 Add a Permission。 Select My Api 选项卡,搜索发布应用角色的应用程序,您会在下面的列表中看到应用角色。 Select那个,保存然后grant admin consent