Azure 函数 - 从 Azure sql 服务器中的 blob 存储导入 bacpac 文件 - AAD 令牌

Azure function - Import bacpac file from blob storage in Azure sql server - AAD token

我们想通过 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 以及需要传入 header 的 subKey 来验证此请求(我也很困惑为什么我需要验证当一切都将在 Azure 本身内执行时)

如果我没有通过 header,则会收到 401(未授权)错误代码。

不用说,您需要为请求提供有效的不记名令牌。您有几个选项可以请求令牌。

托管服务标识

托管服务身份是去年引入的相对较新的服务。将这些视为您的应用程序的服务帐户,允许它们与其他应用程序通信。它实质上是抽象出一些复杂性和手动步骤来设置和验证 Azure AD 应用程序(见下文)。可以在 https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity 找到更多详细信息。托管服务标识正迅速成为 Azure 资源相互验证的默认最佳实践。

Azure AD 应用程序

这是从任何服务(云或 on-premise)访问令牌的传统方式:

  • 设置一个 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、客户端机密等)结合使用以请求令牌。该令牌作为您的 header 的一部分在您的 http 请求中传递。在一天结束时,如果您使用 .net 的 ADAL 库,您的代码将看起来像这样来请求令牌:


AuthenticationContext authenticationContext = new 
AuthenticationContext("https://login.microsoftonline.com/<tenantId>");
AuthenticationResult result = await 
authenticationContext.AcquireTokenAsync("https://resourceUrl",
                                                    clientCredential);

这些是一些相当高级的步骤。无论是直接使用 Azure AD 应用程序还是通过托管服务帐户,您都需要提供对正在使用的资源的访问权限。如果您对特定的 steps\options 有疑问,我建议创建一个新问题,因为它们不是 Azure Functions 的任何特定内容。