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 的任何特定内容。
我们想通过 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 的任何特定内容。