Azure Functions:如何使用 C# 代码以编程方式访问主机密钥?
Azure Functions: How to access the host key programmatically using C# code?
我正在编写一个需要提供 HTML 页面和表单的 Azure Function App。表单应该 post 返回到应用程序的端点之一。该应用程序应受到 Azure 的 Authorization Key 功能的保护。
Azure 允许调用者以两种方式提供 his/her 密钥:
- 带有
code
请求查询参数。
- 使用
x-functions-clientid
HTTP header。
为了成功调用 Azure Function App 的另一个端点,我需要在请求的同时提供主机密钥。例如像这样:
<form method='post' action='DoSomething?code={{{WHERE TO GET THIS FROM?}}}'>
<input name='someInput' />
<input type='submit' />
</form>
我正在使用 C# 生成 HTML 代码。以编程方式获取 the/a 主机密钥的最 bullet-proof 方法是什么?
您可以使用 Microsoft.Azure.Management.ResourceManager.Fluent 和 Microsoft.Azure.Management.Fluent 来做到这一点。
有关详细信息,请参阅此 。
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;
}
我正在编写一个需要提供 HTML 页面和表单的 Azure Function App。表单应该 post 返回到应用程序的端点之一。该应用程序应受到 Azure 的 Authorization Key 功能的保护。
Azure 允许调用者以两种方式提供 his/her 密钥:
- 带有
code
请求查询参数。 - 使用
x-functions-clientid
HTTP header。
为了成功调用 Azure Function App 的另一个端点,我需要在请求的同时提供主机密钥。例如像这样:
<form method='post' action='DoSomething?code={{{WHERE TO GET THIS FROM?}}}'>
<input name='someInput' />
<input type='submit' />
</form>
我正在使用 C# 生成 HTML 代码。以编程方式获取 the/a 主机密钥的最 bullet-proof 方法是什么?
您可以使用 Microsoft.Azure.Management.ResourceManager.Fluent 和 Microsoft.Azure.Management.Fluent 来做到这一点。
有关详细信息,请参阅此
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;
}