摘要:我有一个用于功能测试的 REST API。我只允许具有特定“测试人员”角色的人员或组访问 API。我想在 Azure DevOps Release Pipeline 期间自动触发此功能测试,但我不知道如何授权机器帐户访问 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 中注册了一个企业应用程序。在清单中,我声明了角色。
然后在企业应用程序中添加一些用户和组,这些用户和组被分配了“测试员”角色。
这适用于手动运行我的功能测试。我运行测试,它会弹出一个 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 服务主体,将证书与服务主体关联,在我的部署机器上安装证书,如果证书可用,则以服务主体身份登录,然后将该服务主体放在“测试器”中角色。问题是我无法在企业应用程序中将服务主体添加为用户。它似乎只允许我添加“用户和组”。我同样无法将服务主体添加到组中。
关于如何授权我的部署框访问这些 API 有什么想法吗?