0

通常,我想使用 C#.net 从 Azure blob 存储帐户获取文件,并且我有一个 SPN 名称。我尝试了以下方法来做到这一点。

注意:此处存储在 KEY Vault 和 Azure 管理员中的身份验证密钥仅向我们提供 SPN 名称

方式一:

private static async Task<string> GetAccessToken()
string accessToken = "";
            try
            {
                var authContext = new AuthenticationContext($"https://login.windows.net/{TenantID}");
                var credential = new ClientCredential("{ClientID}", "{SPN Name}");
                var result = await authContext.AcquireTokenAsync("https://storage.azure.com", credential);

                if (result == null)
                {
                    throw new Exception("Failed to authenticate via ADAL");
                }
                accessToken = result.AccessToken;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Trace.WriteLine("Exception for get Blob container" + ex.Message.ToString());
            }

方式二:

private static async Task<string> GetAccessToken()
 var serviceTokenProvider = new AzureServiceTokenProvider();

            var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(serviceTokenProvider.KeyVaultTokenCallback));
          
            SecretBundle secretValue = null;
            try
            {
                secretValue = await keyVaultClient.GetSecretAsync("{KeyVault URI}", {SPN_Name});
            }
            catch (Exception kex)
            {
                System.Diagnostics.Trace.WriteLine("Exception for get Blob container" + kex.Message.ToString());
            }
           return secretValue.Value;

以下代码从 Azure 存储访问文件

public static async Task<List<IListBlobItem>> GetBlobContainer( string containerName)
        var token = await GetAccessToken();
                TokenCredential tokenCredential = new TokenCredential(token);
        //here i am getting all one day file
                DateTime date = DateTime.Now;
                date = date.AddDays(-1);
               
                StorageCredentials _objectCrentials = new StorageCredentials(tokenCredential);

                CloudBlobClient blobClient = new CloudBlobClient(new Uri($"{Storage Account URI}"), _objectCrentials);
                // container
                CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);
                IEnumerable<IListBlobItem> listOfBlob = blobContainer.ListBlobs().OfType<CloudBlob>()
                   .OrderByDescending(b => b.Properties.LastModified > date);
                //check her do you get any list
                _list = listOfBlob.ToList();

方式 2 给出了这个错误。

参数:连接字符串:[未指定连接字符串],资源:https ://vault.azure.net ,权限: https://login.windows.net/{tenantID}。异常消息:尝试了以下 3 种方法来获取访问令牌,但都没有奏效。参数:连接字符串:[未指定连接字符串],资源:https ://vault.azure.net ,权限: https://login.windows.net/{tenantID}。异常消息:尝试使用托管服务标识获取令牌。无法连接到实例元数据服务 (IMDS)。跳过对托管服务身份 (MSI) 令牌端点的请求。参数:连接字符串:[未指定连接字符串],资源:https ://vault.azure.net ,权限:https://login.windows.net/{tenantID}。异常消息:尝试使用 Visual Studio 获取令牌。无法获取访问令牌。Visual Studio 令牌提供程序 Microsoft.Asal.TokenService.exe 的异常:TS003:错误,TS005:未找到帐户。请转到工具->选项-> Azure 服务身份验证,并添加一个帐户以在开发过程中对 Azure 服务进行身份验证。

参数:连接字符串:[未指定连接字符串],资源:https ://vault.azure.net ,权限: https://login.windows.net/{tenantID}。异常消息:尝试使用 Azure CLI 获取令牌。无法获取访问令牌。'az' 不是内部或外部命令、可运行程序或批处理文件。

如果遵循错误的步骤,请纠正我。

4

0 回答 0