摘要::我有一个用于功能测试的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中注册了一个企业应用程序。在清单中,我声明了角色。
然后在企业应用程序中添加一些用户和组,这些用户和组被分配了角色“ Tester”。
这对于手动运行我的功能测试很好。我运行测试,它会弹出一个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的任何想法?
答案 0 :(得分:2)
为应用程序发布的角色被视为application permissions,不能通过“用户和组”分配屏幕分配给其他应用程序。
要将应用程序权限分配给客户端应用程序,请转到客户端应用程序的注册页面,依次单击Api Permissions
和Add a Permission
。选择My Api
标签,搜索发布了应用程序角色的应用程序,您将在下面的列表中看到该应用程序角色。选择它,保存,然后grant admin consent。