【问题标题】:Azure Functions: How to access the host key programmatically using C# code?Azure Functions:如何使用 C# 代码以编程方式访问主机密钥?
【发布时间】:2023-03-19 04:16:01
【问题描述】:

我正在编写一个需要提供带有表单的 HTML 页面的 Azure 函数应用程序。表单应回传到应用程序的端点之一。该应用程序应受 Azure 的Authorization Key 功能保护。

Azure 允许调用者以两种方式提供他/她的密钥:

  1. 带有code 请求查询参数。
  2. 带有x-functions-clientid HTTP 标头。

为了成功调用 Azure Function App 的另一个端点,我需要在请求的同时提供主机密钥。比如这样:

    <form method='post' action='DoSomething?code={{{WHERE TO GET THIS FROM?}}}'>
        <input name='someInput' />
        <input type='submit' />
    </form>

我使用 C# 来生成 HTML 代码。以编程方式获取/主机密钥的最安全方法是什么?

【问题讨论】:

    标签: c# azure-functions azure-function-app


    【解决方案1】:

    您可以使用 Microsoft.Azure.Management.ResourceManager.Fluent 和 Microsoft.Azure.Management.Fluent 来执行此操作。

    请参阅此SO thread 了解更多信息。

    string clientId = "client id";
     string secret = "secret key";
     string tenant = "tenant id";
     var functionName ="functionName";
     var webFunctionAppName = "functionApp name";
     string resourceGroup = "resource group name";
     var credentials = new AzureCredentials(new ServicePrincipalLoginInformation { ClientId = clientId, ClientSecret = secret}, tenant, AzureEnvironment.AzureGlobalCloud);
     var azure = Azure
              .Configure()
              .Authenticate(credentials)
              .WithDefaultSubscription();
    
     var webFunctionApp = azure.AppServices.FunctionApps.GetByResourceGroup(resourceGroup, webFunctionAppName);
     var ftpUsername = webFunctionApp.GetPublishingProfile().FtpUsername;
     var username = ftpUsername.Split('\\').ToList()[1];
     var password = webFunctionApp.GetPublishingProfile().FtpPassword;
     var base64Auth = Convert.ToBase64String(Encoding.Default.GetBytes($"{username}:{password}"));
     var apiUrl = new Uri($"https://{webFunctionAppName}.scm.azurewebsites.net/api");
     var siteUrl = new Uri($"https://{webFunctionAppName}.azurewebsites.net");
     string JWT;
     using (var client = new HttpClient())
      {
         client.DefaultRequestHeaders.Add("Authorization", $"Basic {base64Auth}");
    
         var result = client.GetAsync($"{apiUrl}/functions/admin/token").Result;
         JWT = result.Content.ReadAsStringAsync().Result.Trim('"'); //get  JWT for call funtion key
       }
     using (var client = new HttpClient())
     {
        client.DefaultRequestHeaders.Add("Authorization", "Bearer " + JWT);
        var key = client.GetAsync($"{siteUrl}/admin/functions/{functionName}/keys").Result.Content.ReadAsStringAsync().Result;
      }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-27
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      • 1970-01-01
      • 1970-01-01
      • 2016-12-07
      • 1970-01-01
      相关资源
      最近更新 更多