创建非交互式身份验证 .NET HDInsight 应用程序

可以在应用程序自身的标识(非交互式)或应用程序的已登录用户标识(交互式)下运行 Microsoft .NET Azure HDInsight 应用程序。 本文介绍了如何创建非交互式身份验证 .NET 应用程序以连接到 Azure 并管理 HDInsight。 有关交互式应用程序的示例,请参阅连接到 Azure HDInsight

需要从非交互式 .NET 应用程序中获取:

先决条件

将角色分配给 Azure AD 应用程序

向 Azure AD 应用程序分配角色,为其授予执行操作的权限。 可将作用域设置为订阅、资源组或资源级别。 较低级别的作用域将继承权限。 (例如,将某个应用程序添加到资源组的“读取者”角色意味着该应用程序可以读取该资源组及其中包含的所有资源。)在本教程中,将在资源组级别设置作用域。 有关详细信息,请参阅使用角色分配管理对 Azure 订阅资源的访问权限

将“所有者”角色添加到 Azure AD 应用程序

  1. 登录到 Azure 门户
  2. 在左侧菜单中,选择“资源组”。
  3. 选择包含 HDInsight 群集(在本教程中的后面部分,会在其中运行 Hive 查询)的资源组。 如果有大量资源组,可以使用筛选器查找所需的资源组。
  4. 在“资源组”菜单中,选择“访问控制(标识和访问管理)”。
  5. 在“用户”下,选择“添加”。
  6. 按照说明将“所有者”角色添加到 Azure AD 应用程序。 成功添加角色后,应用程序将在“用户”下列出,含“所有者”角色。

开发 HDInsight 客户端应用程序

  1. 创建 C# 控制台应用程序。
  2. 添加以下 NuGet 包:

     Install-Package Microsoft.Azure.Common.Authentication -Pre
     Install-Package Microsoft.Azure.Management.HDInsight -Pre
     Install-Package Microsoft.Azure.Management.Resources -Pre
    
  3. 运行以下代码:

        using System;
        using System.Security;
        using Microsoft.Azure;
        using Microsoft.Azure.Common.Authentication;
        using Microsoft.Azure.Common.Authentication.Factories;
        using Microsoft.Azure.Common.Authentication.Models;
        using Microsoft.Azure.Management.Resources;
        using Microsoft.Azure.Management.HDInsight;
    
        namespace CreateHDICluster
        {
            internal class Program
            {
                private static HDInsightManagementClient _hdiManagementClient;
    
                private static Guid SubscriptionId = new Guid("<Enter Your Azure Subscription ID>");
                private static string tenantID = "<Enter your tenant ID (also called directory ID)>";
                private static string applicationID = "<Enter Your Application ID>";
                private static string secretKey = "<Enter the Application Secret Key>";
                private static Uri BaseUri = new Uri("https://management.chinacloudapi.cn/");
    
                private static void Main(string[] args)
                {
                    var key = new SecureString();
                    foreach (char c in secretKey) { key.AppendChar(c); }
    
                    var tokenCreds = GetTokenCloudCredentials(tenantID, applicationID, key);
                    var subCloudCredentials = GetSubscriptionCloudCredentials(tokenCreds, SubscriptionId);
    
                    var resourceManagementClient = new ResourceManagementClient(BaseUri, subCloudCredentials);
                    resourceManagementClient.Providers.Register("Microsoft.HDInsight");
    
                    _hdiManagementClient = new HDInsightManagementClient(subCloudCredentials, BaseUri);
    
                    var results = _hdiManagementClient.Clusters.List();
                    foreach (var name in results.Clusters)
                    {
                        Console.WriteLine("Cluster Name: " + name.Name);
                        Console.WriteLine("\t Cluster type: " + name.Properties.ClusterDefinition.ClusterType);
                        Console.WriteLine("\t Cluster location: " + name.Location);
                        Console.WriteLine("\t Cluster version: " + name.Properties.ClusterVersion);
                    }
                    Console.WriteLine("Press Enter to continue");
                    Console.ReadLine();
                }
    
                /// Get the access token for a service principal and provided key.          
                public static TokenCloudCredentials GetTokenCloudCredentials(string tenantId, string clientId, SecureString secretKey)
                {
                    var authFactory = new AuthenticationFactory();
                    var account = new AzureAccount { Type = AzureAccount.AccountType.ServicePrincipal, Id = clientId };
                    var env = AzureEnvironment.PublicEnvironments[EnvironmentName.AzureChinaCloud];
                    var accessToken =
                        authFactory.Authenticate(account, env, tenantId, secretKey, ShowDialog.Never).AccessToken;
    
                    return new TokenCloudCredentials(accessToken);
                }
    
                public static SubscriptionCloudCredentials GetSubscriptionCloudCredentials(SubscriptionCloudCredentials creds, Guid subId)
                {
                    return new TokenCloudCredentials(subId.ToString(), ((TokenCloudCredentials)creds).Token);
                }
            }
        }
    

后续步骤