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

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

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

先决条件

HDInsight 群集。 请参阅入门教程

向 Microsoft Entra 应用程序分配角色

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

将“所有者”角色添加到 Microsoft Entra 应用程序

  1. 登录 Azure 门户
  2. 导航到具有 HDInsight 群集的资源组,在本文的后面部分中你将在该群集上运行 Hive 查询。 如果有大量资源组,可以使用筛选器查找所需的资源组。
  3. 在“资源组”菜单中,选择“访问控制(标识和访问管理)”
  4. 选择“角色分配”选项卡以查看当前的角色分配。
  5. 在页面顶部,选择“+ 添加”。
  6. 按照说明将“所有者”角色添加到 Microsoft Entra 应用程序。 成功添加角色后,应用程序将在“所有者”角色下列出。

开发 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 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(subCloudCredentials);
                resourceManagementClient.Providers.Register("Microsoft.HDInsight");
    
                _hdiManagementClient = new HDInsightManagementClient(subCloudCredentials);
    
                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);
            }
        }
    }
    

后续步骤