如何使用 C#.net 使用 Azure 服务主体名称 (SPN) 从 Azure 服务Azure blob 存储获取文件?

问题描述

一般来说,我想使用 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());
            }

方式 2:

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' 不是 被识别为内部或外部命令、可运行的程序或 批处理文件。

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...