从azure功能应用

时间:2017-09-21 07:45:50

标签: azure azure-functions azure-cli

我正在尝试使用Azure cli编写环境脚本。我创建了一些功能应用程序,并希望添加主机密钥或至少检索自动创建的默认密钥。天蓝色的cli根本没有任何支持。

在函数本身上似乎有一个api(文档似乎很稀疏),它允许我获取密钥,但是你需要一个密钥才能使用它......所以没有帮助。

https://github.com/Azure/azure-webjobs-sdk-script/wiki/Key-management-API

例如:https://example-functions.azurewebsites.net/admin/host/keys?code=somecodeyoualreadyknow

我见过其他一些使用webapps scm api下载包含密钥的json文件的例子但是我不知道如何使用这个API进行身份验证。我有一个服务主体(userid,密码,tenantid),我希望不必在我的脚本中添加另一个身份验证方案。

7 个答案:

答案 0 :(得分:8)

以下是步骤。

  1. 假设您已经拥有了Kudu部署凭据。 (听起来你已经知道如何做到了。你可以通过ARM服务原则等来获得它)
  2. 从kudu部署信用卡中,您可以获得一个允许您调用Functions键API的JWT。
  3. 从Functions API中,您可以获得所有密钥(包括您的密钥)。
  4. 这是一个PowerShell脚本,用于演示从Kudu部署信用证到功能主密钥的确切调用:

    # You need to start with these:
    $site = "YourSiteName"
    $username='YourDeploymentUserName'
    $password='YourDeploymentPassword'
    
    # Now... 
    $apiBaseUrl = "https://$($site).scm.azurewebsites.net/api"
    $siteBaseUrl = "https://$($site).azurewebsites.net"
    
    # For authenticating to Kudu
    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))
    
    
    # Call Kudu /api/functions/admin/token to get a JWT that can be used with the Functions Key API 
    $jwt = Invoke-RestMethod -Uri "$apiBaseUrl/functions/admin/token" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method GET
    
    # Call Functions Key API to get the master key 
    $x = Invoke-RestMethod -Uri "$siteBaseUrl/admin/host/systemkeys/_master" -Headers @{Authorization=("Bearer {0}" -f $jwt)} -Method GET
    
    $masterKey = $x.value
    

答案 1 :(得分:5)

  

我不知道如何获得" kudu"使用我的服务主体凭证的凭证

如果C#代码可以接受,我们可以使用Microsoft.Azure.Management.ResourceManager.FluentMicrosoft.Azure.Management.Fluent来轻松完成。以下是如何获取kudu凭证并运行密钥管理API的演示。我在本地测试它,它在我这边正常工作。

 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;
  }

enter image description here

答案 2 :(得分:3)

我只是可以使用以下命令在Azure CLI中进行这项工作:

az rest --method post --uri \
"/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Web/sites/$FUNCTION_APP_NAME/host/default/listKeys?api-version=2018-11-01" \
--query functionKeys.default --output tsv

我知道答案还差两年了,但这可能会帮助正在搜索的人。

答案 3 :(得分:0)

感谢您的回复。使用你的答案Mike S并在csharp流畅的源代码中搜索(感谢Tom Sun)我最终得到了这个。当然需要很多令牌!我开始使用的凭据是您从az ad sp create-for-rbac -n $name --role contributor

返回的凭据
$credentials = (ConvertFrom-Json $env:AzureCliLogin)

$tenant = $credentials.tenant
$clientId = $credentials.appId
$clientSecret = $credentials.password
$subscriptionId = "<subscription id>"

$body = @{
    "grant_type"="client_credentials";
    "client_id"=$clientId;
    "client_secret"=$clientSecret;
    "resource"="https://management.azure.com/"
}

$authInfo = Invoke-RestMethod -Uri "https://login.microsoftonline.com/$tenant/oauth2/token" -Body $body -Method Post -Headers @{"Content-Type"="application/x-www-form-urlencoded"} 

$publishData = Invoke-RestMethod -Uri "https://management.azure.com/subscriptions/$subscriptionId/resourceGroups/$resourceGroup/providers/Microsoft.Web/sites/$name/publishxml?api-version=2016-08-01" -Method Post -Headers @{"Authorization"="Bearer $($authInfo.access_token)"}

$userName = $publishData.publishData.publishProfile[0].userName
$password = $publishData.publishData.publishProfile[0].userPWD

$apiBaseUrl = "https://$name.scm.azurewebsites.net/api"
$siteBaseUrl = "https://$name.azurewebsites.net"

# For authenticating to Kudu
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))    

# Call Kudu /api/functions/admin/token to get a JWT that can be used with the Functions Key API 
$jwt = Invoke-RestMethod -Uri "$apiBaseUrl/functions/admin/token" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -Method GET

# Call Functions Key API to get the master key 
$x = Invoke-RestMethod -Uri "$siteBaseUrl/admin/host/systemkeys/_master" -Headers @{Authorization=("Bearer {0}" -f $jwt)} -Method GET

$masterKey = $x.value

答案 4 :(得分:0)

如果要使用bash进行操作,请参阅this gist作为开始

答案 5 :(得分:0)

如果您只想获取密钥而无需自动进行身份验证过程:

Get-AzResource -Name RESOURCE-NAME | Invoke-AzResourceAction -Action host/default/listkeys -Force

答案 6 :(得分:0)

确保您拥有最新版本的 Az 模块。

安装:

Install-Module -Name Az -Force

更新:

Update-Module -Name Az

确保在运行上述命令之一后启动一个新的 PowerShell 窗口。

然后,您可以在设置资源组名称和函数名称变量后运行以下命令:

$azureFunction = Get-AzFunctionApp -ResourceGroupName $resourceGroupName -Name $azureFunctionName
$keys = Invoke-AzResourceAction -ResourceId $($azureFunction.Id) -Action "host/default/listKeys" -Force
$defaultKey = $keys.functionKeys.default