【问题标题】:Generating SAS Shared Access Signature Automatically自动生成 SAS 共享访问签名
【发布时间】:2020-10-09 04:08:23
【问题描述】:

我有一些小问题。 我们公司正在使用 Azure Logic Apps + Azure SQL Store Procedures 将数据从 Azure Blob 存储加载到 Azure SQL 表中。 数据在本地服务器上通过 .csv 格式的 PowerShell 脚本生成,并通过 AZCOPY 发送到 Azure Blob 存储。 AZCOPY 正在使用 SAS 令牌。 Azure SQL 使用 SAS 令牌访问外部数据源。 我的问题是 - 是否有可能以某种方式生成 SAS 令牌和下一步在 SQL 服务器上使用新令牌执行查询?

ALTER DATABASE SCOPED CREDENTIAL BlobCredential WITH IDENTITY = '共享访问签名', 秘密 = 'sv=SAS_TOKEN';

我知道 AZCOPY 中的令牌我无法自动更新,我必须手动更新它。

对不起我的英语。

感谢您的意见! 彼得

【问题讨论】:

    标签: azure powershell


    【解决方案1】:

    这是连接到 Azure SQL DB 的方式。

    string ConnectionString =@"Data Source=n9lxnyuzhv.database.windows.net; Initial Catalog=testdb;"
    SqlConnection conn = new SqlConnection(ConnectionString);
    conn.AccessToken = "Your JWT token"
    conn.Open();
    

    对于 JWT 令牌: 搜索 Azure AD 的 OAuth 授权流。有几个关于如何获取令牌的示例,通常它们需要客户端密码(密码)或证书。

    您可以在 OnPremise VM 上安装证书。您可以在此处参考如何使用客户端证书获取令牌。

    https://github.com/AzureAD/microsoft-authentication-library-for-dotnet/wiki/Client-credential-flows#construction-of-confidentialclientapplication-with-client-credentials

    var app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
               .WithAuthority(AzureCloudInstance.AzurePublic, "{tenantID}")
               .WithClientSecret(config.ClientSecret)
               .Build();
    
    X509Certificate2 certificate = ReadCertificate(config.CertificateName);
    var app = ConfidentialClientApplicationBuilder.Create(config.ClientId)
               .WithAuthority(AzureCloudInstance.AzurePublic, "{tenantID}")
               .WithCertificate(certificate)
               .Build();
    
    string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
    
    AuthenticationResult result = null;
    try
    {
     result = await app.AcquireTokenForClient(scopes)
                       .ExecuteAsync();
    }
    catch(MsalServiceException ex)
    {
     // Case when ex.Message contains:
     // AADSTS70011 Invalid scope. The scope has to be of the form "https://resourceUrl/.default"
     // Mitigation: change the scope to be as expected
    }
    

    【讨论】:

      【解决方案2】:

      我认为您需要编写一个存储过程并将 sas 令牌作为参数传递给它:

      ALTER PROCEDURE XXXX
          @sastoken NVARCHAR(200)
      AS
      
      BEGIN TRY
          BEGIN TRANSACTION       
              
              DECLARE @Command NVARCHAR(MAX)
              SET @Command  = 'ALTER DATABASE SCOPED CREDENTIAL MyAzureBlobStorageCredential WITH IDENTITY = ' + Char(39) + 'SHARED ACCESS SIGNATURE'+ Char(39) + ' ,SECRET = '+ CHAR(39) + @sastoken + CHAR(39)
              EXEC (@Command)
      
              ALTER EXTERNAL DATA SOURCE MyAzureBlobStorage
                  SET
                      LOCATION = 'YYYY', 
                      CREDENTIAL= MyAzureBlobStorageCredential
      
              
              BULK INSERT ZZZZ
              FROM 'somefile.csv'
              WITH
              (
                  DATA_SOURCE = 'MyAzureBlobStorage',
                  FIRSTROW=2,
                  FIELDTERMINATOR = ',',
                  ROWTERMINATOR = '\n'
              )
      
      COMMIT TRANSACTION
      END TRY
      

      【讨论】:

        猜你喜欢
        • 2020-05-09
        • 1970-01-01
        • 2021-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-24
        • 2019-10-10
        • 2017-10-16
        相关资源
        最近更新 更多