通过PowerShell重命名ADLS Gen2文件时遭遇AuthenticationFailed异常求助
解决ADLS Gen2 REST API重命名文件时的AuthenticationFailed异常
看起来你遇到的问题核心是签名构造时没有正确包含所有必要的请求头和参数,导致服务器无法验证你的请求。ADLS Gen2的SharedKey签名对请求头的完整性和格式要求非常严格,尤其是涉及自定义x-ms-开头的头时。
问题分析
你的错误提示是AuthenticationFailed,说明签名字符串的构造不符合要求。主要可能出在这几个地方:
x-ms-rename-source头没有被正确加入到**规范头(CanonicalizedHeaders)**中x-ms-rename-source的路径格式不正确- 签名字符串的整体结构遗漏了必要的字段或格式错误
修正步骤与代码示例
下面是调整后的完整代码,重点修复签名构造部分:
# 定义基础参数 $StorageAccountName = "your-storage-account" $FilesystemName = "adlsg2filesystemname" $AccessKey = "your-access-key" $date = [System.DateTime]::UtcNow.ToString("R") # 重命名相关参数:源文件路径和目标文件路径 $sourceFilePath = "folderpath/filename" $targetFilePath = "folderpath/new-filename" # 1. 构造签名所需的各个部分 $verb = "PUT" # 重命名操作使用PUT方法 # 标准HTTP头字段(无值的留空) $contentEncoding = "" $contentLanguage = "" $contentLength = "" $contentMD5 = "" $contentType = "" $ifModifiedSince = "" $ifMatch = "" $ifNoneMatch = "*" # 你的条件请求头 $ifUnmodifiedSince = "" $range = "" # 规范头:所有x-ms-开头的头,小写并按名称排序 $canonicalHeaders = @( "x-ms-date:$date", "x-ms-rename-source:/$StorageAccountName/$FilesystemName/$sourceFilePath", # 注意路径必须包含存储账户名 "x-ms-version:2018-11-09" ) | Sort-Object | Join-String -Separator "`n" $canonicalHeaders += "`n" # 规范头末尾必须加换行 # 规范资源:目标文件的完整路径 $canonicalResource = "/$StorageAccountName/$FilesystemName/$targetFilePath`n" # 2. 拼接完整的签名字符串 $stringToSign = "$verb`n" + "$contentEncoding`n" + "$contentLanguage`n" + "$contentLength`n" + "$contentMD5`n" + "$contentType`n" + "`n" + # Date字段已用x-ms-date替代,此处留空 "$ifModifiedSince`n" + "$ifMatch`n" + "$ifNoneMatch`n" + "$ifUnmodifiedSince`n" + "$range`n" + $canonicalHeaders + $canonicalResource # 3. 生成签名和授权头 $sharedKey = [System.Convert]::FromBase64String($AccessKey) $hasher = New-Object System.Security.Cryptography.HMACSHA256 $hasher.Key = $sharedKey $signedSignature = [System.Convert]::ToBase64String($hasher.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($stringToSign))) $authHeader = "SharedKey ${StorageAccountName}:$signedSignature" # 4. 构造请求头 $headers = @{ "x-ms-date" = $date "x-ms-version" = "2018-11-09" "x-ms-rename-source" = "/$StorageAccountName/$FilesystemName/$sourceFilePath" "Authorization" = $authHeader "If-None-Match" = "*" } # 5. 目标URI是新文件的路径 $URI = "https://$StorageAccountName.dfs.core.windows.net/$FilesystemName/$targetFilePath" # 发送重命名请求 try { Invoke-RestMethod -Uri $URI -Headers $headers -Method Put Write-Host "文件重命名成功" } catch { Write-Host "请求失败: $_" }
关键注意事项
x-ms-rename-source的格式:必须是/{存储账户名}/{文件系统名}/{源文件路径},不能省略存储账户名,否则签名验证会失败。- 规范头排序:所有
x-ms-开头的头必须按小写名称字母顺序排序,这是签名验证的硬性要求。 - 标准头的位置:
If-None-Match属于标准HTTP头,需要放在签名字符串的对应位置(不能加入到规范头中)。 - 请求方法:ADLS Gen2的重命名操作必须使用
PUT方法,因为本质是通过指定源来创建/替换目标资源。
你遇到的原始异常引用
Invoke-RestMethod : {"error":{"code":"AuthenticationFailed","message":"Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.\nRequestId:ddfd851b-501f-0057-3f88-7e0a7d000000\nTime:2019-10-09T09:59:53.7708781Z"}}
内容的提问来源于stack exchange,提问作者Kanhu Charan Sahu
相关产品推荐
相关产品推荐

