sql-server - Azure 函数 - 从 Azure sql server 中的 blob 存储导入 bacpac 文件 - AAD 令牌
问题描述
我们想通过 Azure Functions 将 bacpac 文件从 Blob 存储导入 Azure SQL 服务器,这是 Blob 触发函数。
我们已经实现它如下
log.Info($"C# Blob trigger function Processed blob\n Name:{name} \n Size: {myBlob.Length} Bytes");
var apimUrl = "https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/sqlRG/providers/Microsoft.Sql/servers/sqldev/import?api-version=2014-04-01";
var content = "{'databaseName': 'TestDbImport'," +
"'edition': 'Basic'," +
"'serviceObjectiveName': 'Basic'," +
"'maxSizeBytes': '2147483648'," +
"'storageKeyType': 'SharedAccessKey'," +
"'storageKey': 'xxxxxxx'," +
"'storageUri': 'https://account.blob.core.windows.net/sql-backup/test.bacpac'," +
"'administratorLogin': 'user'," +
"'administratorLoginPassword': 'password'," +
"'authenticationType': 'SQL'}";
HttpClient Client = new HttpClient();
var AADToken = "token";
Client = new HttpClient();
Client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", AADToken);
Client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key","subKey");
var foo = Client.PostAsync(apimUrl, new StringContent(content.ToString())).Result;
log.Info($"result: {foo}");
我需要帮助来了解如何获取 AADToken 以及需要传入标头以验证此请求的 subKey(我也很困惑,为什么我需要在 Azure 本身执行所有内容时进行身份验证)
如果我不传递标头,则会得到 401(未经授权)错误代码。
解决方案
不用说,您需要为请求提供有效的不记名令牌。您有几个选项来请求令牌。
托管服务标识
托管服务标识是去年引入的相对较新的。将这些视为允许它们与其他应用程序通信的应用程序的服务帐户。它本质上是抽象出一些使用 Azure AD 应用程序设置和验证的复杂性和手动步骤(见下文)。可以在https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity找到更多详细信息。托管服务标识正在迅速成为相互验证的默认最佳实践 Azure 资源。
Azure AD 应用程序
这是从任何服务(云或本地)中访问令牌的传统方式:
设置一个 Azure AD 应用程序,您的应用程序将使用它来请求令牌。Azure AD 基于 OAuth,它支持各种请求令牌的方式。由于应用程序在没有用户交互的情况下执行的性质,您将需要使用不需要用户的授权流,例如客户端凭据授权(从 Azure AD 中的完全信任应用开始)。您的 Azure AD 应用程序将需要适当的权限才能使用您的资源。
我建议使用客户端库来协助各种身份验证流程。.Net 中最常见的一个是各种 ADAL 库(https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-authentication-libraries)
将该库与您的 Azure AD 应用程序特定设置(客户端 ID、客户端密码等)结合使用来请求令牌。该令牌作为 HTTP 请求标头的一部分传入。归根结底,如果您使用适用于 .net 的 ADAL 库,您的代码将类似于请求令牌:
AuthenticationContext authenticationContext = new
AuthenticationContext("https://login.microsoftonline.com/<tenantId>");
AuthenticationResult result = await
authenticationContext.AcquireTokenAsync("https://resourceUrl",
clientCredential);
这些是一些相当高级的步骤。无论是直接使用 Azure AD 应用程序还是通过托管服务帐户,您都需要提供对正在使用的资源的访问权限。如果您对特定步骤\选项有疑问,我建议您创建一个新问题,因为它们不是 Azure Functions 特有的。
推荐阅读
- json - Gatsby JSON 加载器不遵循参考
- c# - 当 dispose 选项为真时,为什么我必须手动处置 Serilog Logger(Sumologic sink)?
- xml - Powershell 将 CSV 导出为 XML
- soap - Web 服务能否同时支持 SOAP 1.1 和 1.2
- android - Cordova Angular webView 错误拒绝应用内联样式,因为它违反了以下内容安全策略指令
- google-cloud-platform - 跨区域 GKE 主节点访问
- javascript - 如何在 JS 中将变量放入 Json Array 函数中
- image-processing - 使用 imagemagick 将 GIF 图像转换为 PNG,但得到的是 RGBA 图像而不是调色板版本
- ios - Swift:将html字符串转换为属性字符串时添加空格
- python - 请帮助我使用 python 将 ['1,7'] 转换为 [1,7]