我们希望通过Azure函数(Blob触发函数)将Bacpac文件从Blob存储导入到Azure SQL服务器中。
我们已如下实现
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(未经授权)错误代码。
答案 0 :(得分:0)
不用说,您将需要为请求提供有效的承载令牌。您有几种选择来请求令牌。
托管服务身份
受管服务身份是去年引入的相对较新的内容。可以将它们视为您的应用程序的服务帐户,从而使它们可以与其他应用程序进行通信。它实质上是抽象了一些复杂性和手动步骤,以使用Azure AD Apps进行设置和身份验证(请参见下文)。可以在https://docs.microsoft.com/en-us/azure/app-service/app-service-managed-service-identity上找到更多详细信息。托管服务身份正在迅速成为默认的最佳实践,蔚蓝资源之间会相互认证。
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请求中标头的一部分传入。归根结底,如果您使用.AL的ADAL库,您的代码将看起来像这样以请求令牌:
DECLARE @MaxDate DATETIME;
SELECT @MaxDate = MAX(B.LastDate) FROM dbo.Table2 B
INSERT INTO dbo.Table2
SELECT * FROM dbo.Table1 A
WHERE A.LastDate > @MaxDate
这些是一些相当高级的步骤。无论是直接使用Azure AD应用程序还是通过托管服务帐户,都需要提供对正在使用的资源的访问权限。如果您对特定的步骤/选项有疑问,我建议您创建一个新问题,因为它们不是特定于Azure Functions的。