设置Azure Blob服务属性(REST API)时“身份验证格式不正确”

时间:2014-02-25 13:36:03

标签: azure-storage

我正在尝试按照these instructions在我的Azure Blob存储帐户上设置CORS规则。

这是我提出请求后收到的错误:

  

400未以正确格式提供身份验证信息。检查授权标题的值

请求网址:

PUT https://[MyAccountName].blob.core.windows.net/?restype=service&comp=properties

请求标题:

x-ms-version: 2013-08-15
x-ms-date: Tue, 25 Feb 2014 13:02:00 GMT
Authorization: SharedKey
[MyAccountName]: [MyAccountKey]
Content-Length: 329
Host: [MyAccountName].blob.core.windows.net

请求正文:

<?xml version="1.0" encoding="utf-8"?>
<StorageServiceProperties>
    <Cors>   
          <CorsRule>
                <AllowedOrigins>http://www.example.com</AllowedOrigins>
                <AllowedMethods>GET</AllowedMethods>
                <ExposedHeaders>x-ms-meta-data*,x-ms-meta*</ExposedHeaders>
                <AllowedHeaders>x-ms-meta-target*,x-ms-meta*</AllowedHeaders>
                <MaxAgeInSeconds>200</MaxAgeInSeconds>
        </CorsRule>
    <Cors>
</StorageServiceProperties>

3 个答案:

答案 0 :(得分:1)

请求的授权标头不完整。它需要包含身份验证方案,存储帐户名称和签名。例如;

Authorization: SharedKey myaccount:Z1lTLDwtq5o1UYQluucdsXk6/iB7YxEu0m6VofAEkUE=

有关详细信息,请参阅Authentication for the Windows Azure Storage Services。另一方面,如果您使用其中一个Windows Azure存储客户端库,它将为您处理身份验证。对于.NET库,请参阅我们的NuGet package

答案 1 :(得分:1)

对于访问此页面并想知道为什么即使使用共享访问签名URL也会出现此错误的人,您很可能会将您的APP令牌发送到Azure。在这种情况下,请确保不包括Authorization标头。

答案 2 :(得分:1)

@jsgoupil所说的:

对于访问此页面并想知道即使使用共享访问签名URL为何也会收到此错误的人,您很可能会将您的APP令牌发送到Azure。在这种情况下,请确保不包括Authorization标头。

如果您有拦截器,则可以按照以下stackOverflow帖子中的说明为请求添加跳过: https://stackoverflow.com/a/49047764/5232022

export const InterceptorSkipHeader = 'X-Skip-Interceptor'; // <-- ADD THIS

@Injectable()
export class SkippableInterceptor implements HttpInterceptor {

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    // Add the following if to your interceptor
    if (req.headers.has(InterceptorSkipHeader)) {
      const headers = req.headers.delete(InterceptorSkipHeader);
      return next.handle(req.clone({ headers }));
    }

    ...  // intercept
  }

}

然后,每当您想跳过特定请求的拦截时,

const headers = new HttpHeaders().set(InterceptorSkipHeader, ''); // <-- this will skip it

this.httpClient.get<ResponseType>(someUrl, { headers }) // <-- dont forget to add it here as well