C# Azure 文件共享抛出错误“服务器无法验证请求

标签 c# azure azure-files

我使用以下代码将文件复制到 Azure 文件共享。它抛出错误,有时当我这样做时它会起作用

  1. 例如通过替换连接字符串中的新 key 来重置 key
  2. 通过更改本地计算机中的 cst 和 est 时间(并非所有时间都有效)

我收到错误为

Azure.RequestFailedException:服务器无法对请求进行身份验证。确保授权 header 的值格式正确,包括签名。 请求 ID:b6a51c3f-b01a-0037-7774-d19906000000 时间:2022-09-26T06:53:52.3042347Z 状态:403(服务器无法验证请求。请确保授权 header 的值格式正确,包括签名。) 错误代码:身份验证失败 附加信息: AuthenticationErrorDetail:HTTP 请求“Xrp6MB0=”中发现的 MAC 签名与任何计算的签名不同。服务器使用以下字符串进行签名:'GET 2022 年 9 月 22 日星期四 10:07:55 GMT “0x8DA9C8251A37348” x-ms-客户端-请求-id:25ff53d8-7a55-414a-954b-ff8f6d05bced x-ms-date:2022 年 9 月 26 日星期一 06:53:52 GMT x-ms-return-client-request-id:true x-ms-版本:2021-08-06

内容: AuthenticationFailedServer 未能对请求进行身份验证。确保授权 header 的值格式正确,包括签名。 请求 ID:b6a51c3f- 时间:2022-09-26T06:53:52.3042347ZHTTP 请求“Xrp6MB0=”中发现的 MAC 签名与任何计算出的签名不同。服务器使用以下字符串进行签名:'GET

我正在使用访问 key 1 访问 Azure 文件共享

有人可以让我知道我在代码中犯的错误

using Azure;
    using Azure.Storage.Files.Shares;
    using Microsoft.WindowsAzure.Storage.File;
    using System.Collections.Generic;
    
    var connectionString = "DefaultEndpointsProtocol=https;AccountName=XXXXX;AccountKey=lPI20ZMzVjB9xcPmIJQjjIhFIuWs6JxTcxef7Ri3hRMtE3N1ov81gpabOVe+0BKEFiEZdhcAPhYC+ASt4Yjddw==;EndpointSuffix=core.windows.net";
    var fileShareName = "FileshareName";
    var folderName = "FolderName";
    ShareClient share = new(connectionString, fileShareName);
    if (!share.Exists())
    {
        share.CreateIfNotExists();
    }
    var directory = share.GetDirectoryClient(folderName);
    if(!directory.Exists())
    {
    directory.CreateIfNotExists();    
    }
    var directories = directory.GetFilesAndDirectories();
    
    string sFilename = "sample.pdf";
    string sPath = @"\\abc\Test.pdf";
    
    foreach (var s in directories)
    {
        if (s.Name == "Files")
        {
            var x = directory.GetSubdirectoryClient(s.Name);
            ShareFileClient file = x.GetFileClient(sFilename);
            using (FileStream stream = File.OpenRead(sPath))
            {
                file.Create(stream.Length);
                file.UploadRange(
                    new HttpRange(0, stream.Length),
                    stream);
            }
        }
    }
    Console.ReadLine();

最佳答案

if (!share.Exists()) 不起作用,我们需要编写为 share.CreateIfNotExists()。 它解决了身份验证错误。

我认为该错误是由于运行代码的计算机上的日期/时间设置造成的。

如果您注意到错误消息,则 Azure 存储服务返回的日期/时间为 2022-09-26T06:53:52.3042347Z,但请求中发送的日期/时间值为 >2022 年 9 月 22 日星期四 10:07:55 GMT

由于运行代码的计算机上的当前日期/时间比 Azure 存储服务上的日期/时间早大约 4 天,因此对 Azure 存储的请求将被拒绝。

我建议查看本地计算机上的日期/时间值并确保其正确。

关于C# Azure 文件共享抛出错误“服务器无法验证请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73850413/

相关文章:

c# - 控制台应用问题

c# - 有没有办法从很多图片中找到一个图片框

c# - 在网站上找不到文件 (ASP.NET MVC)

c# - 用于验证文件名的正则表达式

Azure IoThub - 类RegistryManager - 方法AddDeviceAsync(设备)抛出错误代码:ArgumentNull;BadRequest

reactjs - msal-react 访问 token 与 id token 不同的过期时间

Azure CLI 2.0 连接错误

无法访问 Azure 文件共享 |端口 445

c# - 简单文件传输到 Azure c#

c# - 在选定的行 wpf mvvm 上隐藏数据网格中的特定上下文菜单