programing

AzureStorageBLOB Server가 요청을 인증하지 못했습니다.서명을 포함하여 Authorization 헤더 값이 올바르게 형성되었는지 확인합니다.

oldcodes 2023. 5. 9. 22:59
반응형

AzureStorageBLOB Server가 요청을 인증하지 못했습니다.서명을 포함하여 Authorization 헤더 값이 올바르게 형성되었는지 확인합니다.

Windows Azure Blob에 이미지를 업로드하려고 하는데 처리할 수 없는 다음 오류가 발생합니다.

서버가 요청을 인증하지 못했습니다.서명을 포함하여 Authorization 헤더 값이 올바르게 형성되었는지 확인합니다.

컨테이너를 만들 때 오류가 발생합니다.

container.CreateIfNotExists()

여기 제 코드가 있습니다.

try
{
    Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(ConfigurationManager.AppSettings["StorageConnectionString"]);
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

    // Retrieve a reference to a container. 
    CloudBlobContainer container = blobClient.GetContainerReference("samples");

    // Create the container if it doesn't already exist.
    // here is the error
    if (container.CreateIfNotExists())
    {
        container.SetPermissions(
            new BlobContainerPermissions
            {
                PublicAccess = BlobContainerPublicAccessType.Blob
            });
    }
    
    CloudBlockBlob blockBlob = container.GetBlockBlobReference("Image1");
    using (var fileStream = System.IO.File.OpenRead(@"Path"))
    {
        blockBlob.UploadFromStream(fileStream);
    }
}
catch (StorageException ex1)
{
    throw ex1;
}

나는 내 코드에서 많은 옵션을 시도했지만 여전히 오류가 발생합니다.

다른 사람들이 댓글로 제안한 것처럼 내 PC의 시간이 1시간이나 빠졌습니다.그것을 수정한 것이 문제를 해결했습니다.

사용하고 있습니다.메타데이터를 사용하여 업로드하는 Azure Blob 파일용 NET SDK.메타데이터를 사용하여 AzureBlob 저장소에 파일을 업로드하는 동안 오류가 발생했습니다. 오류는 "서버가 요청을 인증하지 못했습니다. 서명을 포함하여 Authorization 헤더 값이 올바르게 형성되었는지 확인하십시오."그러나 이러한 오류는 일부 파일에 지나지 않았습니다.

여기서 문제 파일에 대한 메타데이터가 있는 경우 메타데이터에 값과 값의 끝으로 시작하는 특수 문자(") 또는 추가 공간(")이 포함되어서는 안 됩니다.

메타데이터 값을 수정하면 파일이 성공적으로 업로드됩니다.

REST API Endpoint를 통해 BLOB 스토리지에 액세스하려고 할 때 이 메시지가 표시되었습니다.

는 목록 을 래는리스컨작호업때응받답으로 호출했을 때 받은 응답입니다.Authorization

<?xml version="1.0" encoding="utf-8"?>
<Error>
    <Code>AuthenticationFailed</Code>
    <Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:096c6d73-f01e-0054-6816-e8eaed000000
Time:2019-03-31T23:08:43.6593937Z</Message>
    <AuthenticationErrorDetail>Authentication scheme Bearer is not supported in this version.</AuthenticationErrorDetail>
</Error>

솔루션은 아래 헤더를 포함하는 것이었습니다.

x-ms-version: 2017-11-09

제 경우에는 실제로 만료된 것은 공유 액세스 서명(SAS)이었습니다.portal.azure.com 의 공유 액세스 서명을 업데이트(새로운 액세스 서명을 만드는 데 필요)하는 방법은 향후 종료 날짜에 대해 향후 1년(또는 그 이상)을 추가합니다.그리고 모든 문제가 해결되었습니다.

제 경우에는 콘솔 응용 프로그램에 대한 인수로 액세스 서명이 있는 스토리지 연결 문자열을 전달하고 있었습니다.명령줄에는 '명령줄 매개 변수'라는 특수 문자가 있습니다.액세스 서명(SAS)에 나타납니다.%%를 탈출해야 합니다. %%를 두 배로 늘려야 합니다.

오류 메시지


서버가 요청을 인증하지 못했습니다.서명을 포함하여 Authorization 헤더 값이 올바르게 형성되었는지 확인합니다.

솔루션


애플리케이션에서 동일한 문제가 발생하여 key1 대신 key2에 대한 공유 액세스 서명(zure 포털에서)을 생성하여 해당 문제를 해결했습니다.키를 변경하면 오류가 해결됩니다. (설정 > 공유 액세스 서명) 또한 연결 문자열을 사용할 경우에도 업데이트해야 합니다.(설정 > 액세스 키)

간단한 Azure AppService에서 Storage 계정에 연결하려고 할 때 동일한 오류가 발생했습니다.많은 조사 끝에, 우리는 공식적인 마이크로소프트 지원부에 도움을 요청했습니다.그들은 Azure의 리소스 및 인프라를 확인하고 이 문제가 Application Insights와 관련이 있다고 지적했습니다. 공식 답변은 다음과 같습니다.

요청에 스토리지 클라이언트 요청에 대해 인증 헤더가 서명된 후 추가되는 추가 헤더 'x-ms-request-root-id'가 있습니다.결과적으로 요청이 Azure 스토리지에 의해 인증되면 403이 됩니다.종속성 추적이 활성화된 경우 Application Insights에 의해 이 기능이 추가되는 것으로 보입니다.

따라서 /dev/wwwroot/Application에서 종속성 추적을 사용하지 않도록 설정한 후Insights.config, 오류가 사라졌으며 AppService는 문제 없이 스토리지 계정에 연결할 수 있습니다.

연결 문자열이 로컬 컴퓨터에서 개발할 때 사용한 것과 정확히 동일함에도 불구하고 Azure App Service로 실행할 때 웹 앱이 Table Storage에 액세스하지 못했습니다.

이 문제를 해결하기 위해 저는 Azure App Service에 할당된 ID를 추가하고 스토리지 계정에서 스토리지 계정 기여자 역할을 부여했습니다.

어플은.를 사용하는 NET Core 3.1.NET 라이브러리 Windows Azure.스토리지 버전 9.3.2.

Azure App Service에 시스템 할당 ID 추가 스토어 계정에 스토리지 계정 기여자 역할 할당

URL을 확인합니다.

공유 액세스 토큰 페이지의 Blob SAS URL은 기본 컨테이너 URL입니다. 이 URL은 유효하지 않으며 항상 "서버가 요청을 인증하지 못했습니다."로 표시됩니다.서명을 포함하여 Authorization 헤더 값이 올바르게 형성되었는지 확인하십시오." 오류

토큰이 있는 기본 SAS URL의 예 https://[storage account].blob.core.windows.net/ [메시지]?[블럽스 토큰]

유효한 URL은 다음과 같습니다.

  1. blobs 나열 https://[스토리지 계정].blob.core.windows.net/ [blogs]?restype=filename&comp=list&[blobas 토큰]
  2. BLOB 가져오기 https://[스토리지 계정].blob.core.windows.net/ [이름]/[이름]?[블럽스 토큰]

컴퓨터 또는 휴대폰의 표준 시간대를 확인합니다.

하면 이 합니다.AzureWebJobsStorage입니다.local.settings.json이런 일이 일어날 수 있는 이유는 여러 가지가 있는 것 같고, 이것이 그 중 하나입니다.

제 경우(파이톤)는 업로드 콘텐츠를 문자열에서 바이트로 인코딩해야 했습니다.하지만 오류 메시지에 다음과 같은 메시지가 표시되는 이유는 잘 모르겠습니다.

azure.core.exceptions.ClientAuthenticationError: 
Server failed to authenticate the request. 
Make sure the value of Authorization header is formed correctly including the signature.

여기에 효과가 있었습니다.

버전:

$ python -V
Python 3.7.7
$ pip list | grep azure
azure-core               1.8.1
azure-storage-blob       12.4.0

업로드할 파이썬 함수:

def upload_blob(blob_service_client, content: str, container_name, blob_name):
    blob_client = blob_service_client.get_blob_client(container_name, blob_name)
    try:
        content_bytes = content.encode('utf-8')
        blob_client.upload_blob(content_bytes)
        return True
    except Exception as e:
        logger.error(traceback.format_exc())
        return False        

PUT 요청을 사용하는 동안 이 오류가 나타나면 URL에 새 BLOB 이름이 제공되었는지 확인합니다.

https://{storageAccount}.blob.core.windows.net/{containerName}/{**NEW BLOB NAME TO CREATE**}?{SAS Token}

(python) SAS 토큰을 사용하는 리소스 GET 요청에서 동일한 오류가 발생했지만 로컬 시스템(python, 브라우저 등)을 통해 GET를 시도할 때 항상 정상적으로 작동했습니다.@gmaklari@user2243747의 댓글을 보고 urlretrieve 대신 requests lib를 사용하게 되었습니다(처음 의도는 요청에 헤더를 추가하는 것이었습니다).이제는 잘 작동합니다. 머리글을 추가할 필요가 없습니다.

스토리지 계정과의 연결에 문제가 있는 경우에도 동일한 메시지가 나타납니다.

Account() 에서 확인할 수 있는 (스토리지 계정)로 이동한 다음 "Storage Account(스토리지 계정)"를 입니다.Networking왼쪽 사이드 바에그런 다음 옵션을 확인합니다.Enalbed from all networks스토리지 계정 쪽에서 를 사용할 수 있습니다.

여기에 이미지 설명 입력

개인 엔드포인트를 사용하는 경우 DNS도 올바르게 구성되어 있어야 합니다.

저는 연결 문자열을 다른 컴퓨터로 마이그레이션하면서 앱을 한 컴퓨터에서 다른 컴퓨터로 마이그레이션했습니다.공용 IP가 변경되지 않았고 URL이 만료되지 않았는데 이 오류가 발생했습니다.

일단 사용된 연결 문자열 URL은 해당 컴퓨터에 연결된 것으로 보이며, 처음 사용할 때 다른 지문이 추가될 수도 있습니다.

이에 대한 증거는 없지만 새 연결 문자열을 생성한 후 작동했습니다.

같은 오류가 발생했는데, 정말 이상한 것은 코드를 실행하던 스토리지 계정 3개 중 2개에서 오류가 발생했다는 것입니다.제가 이 문제를 해결한 것은 Azure를 업데이트하는 것입니다.보관소.파일.DataLake 라이브러리를 미리 보기 버전 12.2.2로 이동합니다.그것이 문제를 해결했습니다.다른 모든 제안, 시간 동기화 등을 시도했습니다.아무 것도 효과가 없었습니다.정말 이상한 문제입니다.

저도 같은 오류가 있었습니다.로컬로 디버깅할 때는 스토리지 연결이 작동했지만 Azure App Service에 배포할 때는 작동하지 않았습니다.저는 조금 전에 같은 이름의 스토리지 계정을 삭제하고 다른 Azure 구독에서 다시 생성했습니다.자원 이름을 다시 사용할 수 있게 되었음에도 불구하고, 그것이 무엇을 의미하든 Azure 내부에서 "정확하게 해방"되지 않는 버그가 Azure에 있을 수 있습니까?

다른 이름으로 저장 계정을 만들었을 때 더 이상 오류가 발생하지 않았습니다.

BLOB 저장소를 위한 인증 헤더를 구성하려면 sdk를 사용하거나 문서를 참조해야 하며, 이 오류는 일반적으로 SAS 토큰 유효성 검사 오류로 인해 발생합니다.

SAS 토큰을 인쇄하거나 헤더를 캡처하여 누락된 부분이 있으면 분석하는 것이 좋습니다.SAS 토큰 및 인증 헤더 생성(셸 스크립트) 예제(업로드)를 공유합니다.자세한 내용을 원하시면 이 링크를 확인하실 수 있습니다.

generatesig() {
#######
# From: https://learn.microsoft.com/en-us/rest/api/storageservices/create-account-sas?redirectedfrom=MSDN
#
# StringToSign = signedPermissions + "\n" +  
#                signedStart + "\n" +  
#                signedExpiry + "\n" +  
#                canonicalizedResource + "\n" +  
#                signedIdentifier + "\n" +  
#                signedIP + "\n" +  
#                signedProtocol + "\n" +  
#                signedVersion + "\n" +  
#                signedResource + "\n"
#                signedSnapshotTime + "\n" +
#                rscc + "\n" +  
#                rscd + "\n" +  
#                rsce + "\n" +  
#                rscl + "\n" +  
#                rsct  
    local ST=$(TZ=GMT date -u +"%Y-%m-%dT%H:%M:%SZ")
    local SE=$(TZ=GMT date -u +"%Y-%m-%dT%H:%M:%SZ" -d "next day")
    local canonicalizedResource="/blob/${AZURE_STORAGE_ACCOUNT}/${AZURE_CONTAINER_NAME}/${FILE_NAME}"
    # StringToSign="${AZURE_STORAGE_ACCOUNT}\nr\nb\no\n${ST}\n${SE}\n\nhttps\n2020-08-04"
    # decoded_hex_key="$(echo -n $AZURE_ACCESS_KEY | base64 -d -w0 | xxd -p -c256)"
    # sig=$(printf  "$StringToSign" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:$decoded_hex_key" -binary | base64 -w0)

local StringToSign="r\n${ST}\n${SE}\n${canonicalizedResource}\n\n\nhttps\n2020-08-04\nb\n\n\n\n\n\n"
echo ${StringToSign}
local decoded_hex_key="$(echo -n $AZURE_ACCESS_KEY | base64 -d -w0 | xxd -p -c256)"
local sig=$(printf  "$StringToSign" | openssl dgst -sha256 -mac HMAC -macopt "hexkey:$decoded_hex_key" -binary | base64 -w0)


}

local request_date=$(TZ=GMT date "+%a, %d %h %Y %H:%M:%S %Z")
local storage_service_version="2020-10-02"

# HTTP Request headers
local x_ms_date_h="x-ms-date:$request_date"
local x_ms_version_h="x-ms-version:$storage_service_version"
local signature=$(generatesig)
local authorization_header="Authorization: SharedKey $AZURE_STORAGE_ACCOUNT:$signature"

curl -X ${HTTP_METHOD} \
        -o /dev/null -w '%{http_code}' \
        -H "$x_ms_date_h" \
        -H "$x_ms_version_h" \
        -H "$authorization_header" \
        -H "Content-Length: 0" \
        ${REQUEST_URL}

저의 상황은 OP와 조금 다르지만, 저는 같은 오류를 겪고 있었습니다.이 스레드는 이 모호한 오류에 대한 가능한 솔루션의 훌륭한 저장소가 되었으므로 다음과 같이 해결했습니다.

원래 여러 리소스에서 동시에 사용 권한/범위를 요청했습니다.예: 그래프 + 저장소.제가 문제를 깨닫고 https://storage.azure.com/user_impersonation 스코프만 사용하는 것으로 전환했을 때 오류가 사라졌습니다.

관련 문서: "액세스 토큰은 단일 리소스에만 사용할 수 있습니다."

저는 이 오류의 또 다른 원인을 발견했습니다.제 경우, 이 오류는 이벤트 허브가 펑션 앱과 통합되어 블롭을 읽어 파티션의 진행 상황을 추적하려고 할 때 발생했습니다.

를 꺼낼 는 다음과 같은 합니다.OWNINGHOST블롭에 추가됩니다.나의 경우 어떤 이유로 이것은 변경되었습니다.Owninghost를 메데이편으로 OWNINGHOST문제를 해결했습니다.

로컬 개발 기계에서 Azurite를 사용할 때 이 오류가 발생하여 Blob 서비스 클라이언트에서 사용할 연결 문자열을 잘못 구성했습니다.BLOB에 연결 문자열을 사용하지 않고 큐 저장에 사용했는데 이 오류가 발생했습니다.

이 오류의 다른 원인을 문서화하는 중입니다.

다음 오류가 발생했습니다.

azure.core.exceptions.ClientAuthenticationError: Server failed to authenticate the request. 
Make sure the value of Authorization header is formed correctly including the signature.
authenticationerrordetail:The MAC signature found in the HTTP request is not the same as any computed signature

이 오류의 원인은 잘못된 사용입니다.blob_file_pathblob_client를 생성할 때

blob_client = blob_service_client.get_blob_client(
    container=self.container_name,
    blob=blob_file_path)

확인하십시오.blob_file_path존재하고 정확합니다.

저는 Azure Functions 프로젝트를 netcoreapp 3.1에서 net6.0으로 업그레이드하여 오류를 해결했습니다.

  <PropertyGroup>
      <TargetFramework>net6.0</TargetFramework>
      <AzureFunctionsVersion>v4</AzureFunctionsVersion>
  </PropertyGroup>

저도 같은 문제에 직면해 있었는데, 조사한 결과 "AccountName & SaaS 토큰" 기반 접근 방식을 사용하여 스토리지에 액세스하는 대신 "AccountName & AccountKey" 기반 접근 방식을 사용하고 있었습니다.SaaS 토큰 기반 접근 방식을 사용한 후 이 문제가 해결되었습니다.

언급URL : https://stackoverflow.com/questions/24492790/azurestorage-blob-server-failed-to-authenticate-the-request-make-sure-the-value

반응형