Azure Key Vault 是可安全儲存及存取祕密的服務。
到 Azure Portal
填寫 Key Vault 的資訊
以下是部署資訊
先到 Key Valult 設置我們的秘密
建立秘密
接著呢打開 Azure Cloud Shell 要下兩個指令去設置存取原則。
第一個指令是將 Azure Function 開啟 Managed Identity ,文件好像翻成受控識別。
他就會產生一組 principalId (每次指派移除後都不一樣)
az webapp identity assign --name "Azure Function 名稱" --resource-group "Azure Function 的資源群組名稱"
接著我們要下第二個指令是把剛剛 principalId 加入 Key Vault 存取規則。
後面的 --secret-permissions get list 是我允許他只有 get 跟 list 的權限。
指令下完之後,會出現一大串 json 表示完成了。
az keyvault set-policy --name 'Key Vault名稱' --object-id principalId --secret-permissions get list
其實下完指令只後也可以到存取規則那邊看,會多一筆你剛剛下指令產生的規則。
Azure Function 中
先加入套件
Microsoft.Azure.Services.AppAuthentication
讓您輕鬆擷取 Service-to-Azure-Service 驗證案例的存取權杖。
Microsoft.Azure.KeyVault
包含與 Key Vault 互動的方法。
代碼
#r "Newtonsoft.Json"
using System.Net;
using System.Net.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using StackExchange.Redis;
using Microsoft.Azure.KeyVault;
using Microsoft.Azure.Services.AppAuthentication;
public static async Task<IActionResult> Run(HttpRequest req, ILogger log)
{
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
var redisKey = keyVaultClient.GetSecretAsync("https://keyvault名稱.vault.azure.net/", "秘密名稱").Result.Value;
var connString = $"redis名稱.redis.cache.windows.net:6380,password={ redisKey },ssl=True,abortConnect=False";
var redisConn = ConnectionMultiplexer.Connect(connString);
var db = redisConn.GetDatabase();
var value = db.StringGet("name");
if(string.IsNullOrEmpty(value))
{
db.StringSet("name", name, TimeSpan.FromSeconds(20));
}
else
{
name = value;
}
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
Key Vault 加 Redis Cache 的範例:
Cache 20秒輸入進來的參數,第一次打進來的參數之後不管在怎麼打API 在 20秒內都不會改變。
(覺得這範例好爛 XDDD)