1

我正在尝试调用我使用 C# 和机器学习 REST api 设置的 Azure 机器学习管道端点。

我确信我已经正确配置了服务主体,因为我可以使用azureml-corepython sdk 成功验证并点击端点:

sp = ServicePrincipalAuthentication(
    tenant_id=tenant_id,
    service_principal_id=service_principal_id,
    service_principal_password=service_principal_password)
ws =Workspace.get(
    name=workspace_name, 
    resource_group=resource_group, 
    subscription_id=subscription_id, 
    auth=sp)

endpoint = PipelineEndpoint.get(ws, name='MyEndpoint')
endpoint.submit('Test_Experiment')

我在 C# 中使用以下示例来尝试运行我的端点:https ://docs.microsoft.com/en-us/azure/machine-learning/how-to-deploy-pipelines#run-a-published-管道使用-c

我正在尝试填写auth_key以下代码:

var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");

var cred = new ClientSecretCredential(tenantId, clientId, clientSecret);
var auth_key = cred.GetToken(new Azure.Core.TokenRequestContext(new string[] {".default" }));

我收到 401(未经授权)。

我在做什么错?

  • 更新 *

我将 'scopes' 参数更改TokenRequestContext为如下所示:

var auth_key = cred.GetToken(new Azure.Core.TokenRequestContext(new string[] { "http://DataTriggerApp/.default" }));

http://DataTriggerAppservicePrincipalNames我从 azure CLI 查询我的服务主体时出现的问题之一。

现在,当我尝试使用返回的令牌调用机器学习管道端点时,我收到的是 403 而不是 401。也许有一些进展?

4

1 回答 1

1

好的,通过大量的反复试验,我想出了两种获取令牌的方法,使我能够通过 REST api 访问我的 Azure 机器学习管道端点。一种使用 Microsoft.Identity.Client,另一种使用 Azure.Identity。

using Microsoft.Identity.Client;

...

public static async Task<string> GetAccessToken()
{
      var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
      var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
      var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");

   
      var app = ConfidentialClientApplicationBuilder.Create(clientId)
                                                .WithClientSecret(clientSecret)                                                
                                                .WithAuthority(AzureCloudInstance.AzurePublic, tenantId)
                                                .Build();
      var result = await app.AcquireTokenForClient(new string[] { "https://ml.azure.com/.default" }).ExecuteAsync();
      return result.AccessToken;
}

或者:

using Azure.Identity;
...

public static async Task<string> GetAccessToken()
{
      var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID");
      var clientSecret = Environment.GetEnvironmentVariable("AZURE_CLIENT_SECRET");
      var tenantId = Environment.GetEnvironmentVariable("AZURE_TENANT_ID");


      var cred = new ClientSecretCredential(tenantId, clientId, clientSecret);
      var token =  await cred.GetTokenAsync(new Azure.Core.TokenRequestContext(new string[] { "https://ml.azure.com/.default" }));
      return token.Token;
}
于 2021-10-13T21:20:31.173 回答