首页 > 解决方案 > 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(未经授权)错误代码。

标签: sql-serverauthenticationazure-functionsazure-blob-storagebacpac

解决方案


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

托管服务标识

托管服务标识是去年引入的相对较新的。将这些视为允许它们与其他应用程序通信的应用程序的服务帐户。它本质上是抽象出一些使用 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 特有的。


推荐阅读