2016-02-05 74 views
3

我正尝试使用C#以编程方式从Microsoft.Azure.Management.Compute检索hostedservices。这需要ServiceClientCredential,我不知道如何得到它。谁能帮帮我吗?我能够使用Microsoft.WindowsAzure.Management.Compute来获取它们,但是它仅返回ResourceManager下的实例,而不是经典实例。如何创建serviceclientcredential以便与Microsoft.azure.Management.compute一起使用

+3

事实上,由于某些原因,微软决定只提供有关这些库的最小文档。这是非常混乱的,尤其是经典和资源管理器显然(?)在不同的库中处理,混淆了像Microsoft.Azure.Management.Compute(做一件事)与Microsoft.WindowsAzure.Management.Compute(做了不同的事情) – Nik

+0

我最近几天一直在试图弄清楚这一点,而且我越读它们的文档,越是感到困惑! – k2ibegin

回答

6

1您需要创建Active Directory应用程序。使用此链接创建AD应用https://azure.microsoft.com/en-us/documentation/articles/resource-group-create-service-principal-portal/

示例代码使用Microsoft.Azure.Management.Compute 13.0.1 - 抢鲜SDK 网址:https://www.nuget.org/packages/Microsoft.Azure.Management.Compute/13.0.1-prerelease

public class CustomLoginCredentials : ServiceClientCredentials 
    { 
     private string AuthenticationToken { get; set; } 
     public override void InitializeServiceClient<T>(ServiceClient<T> client) 
     { 
      var authenticationContext = 
       new AuthenticationContext("https://login.windows.net/{tenantID}"); 
      var credential = new ClientCredential(clientId: "xxxxx-xxxx-xx-xxxx-xxx", clientSecret: "{clientSecret}"); 

      var result = authenticationContext.AcquireToken(resource: "https://management.core.windows.net/", 
       clientCredential: credential); 

      if (result == null) 
      { 
       throw new InvalidOperationException("Failed to obtain the JWT token"); 
      } 

      AuthenticationToken = result.AccessToken; 
     } 
    public override async Task ProcessHttpRequestAsync(HttpRequestMessage request, CancellationToken cancellationToken) 
    { 
     if (request == null) 
     { 
      throw new ArgumentNullException("request"); 
     } 

     if (AuthenticationToken == null) 
     { 
      throw new InvalidOperationException("Token Provider Cannot Be Null"); 
     } 



     request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", AuthenticationToken); 
     request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 

     //request.Version = new Version(apiVersion); 
     await base.ProcessHttpRequestAsync(request, cancellationToken); 

    } 
} 

,这里是如何初始化客户端

netClient = new Microsoft.Azure.Management.Compute.ComputeManagementClient(new CustomLoginCredentials()); 

     netClient.SubscriptionId = _subscriptionId; 
+0

为什么我们需要在InitializeServiceClient中做这么多事情?假设我们不使用客户端来执行此操作,似乎最好创建一个可以获取必要资源并生成令牌提供程序的构造函数。 'ProcessHttpRequestAsync'然后可以从auth上下文获取新的令牌(以确保它是最新的当前令牌) – ElFik

相关问题