2014-10-23 3 views
0

안녕하세요, Microsoft Azure Cloud Storage에서 Cors 오류가 발생했습니다.Microsoft Azure 클라우드 저장소의 Cors 오류

다음과 같이 내 SAS를 생성하고 :

CorsRule corsRule = new CorsRule(); 
corsRule.AllowedOrigins.Add("https://---------------.com"); 
corsRule.AllowedMethods = CorsHttpMethods.Get | CorsHttpMethods.Post | CorsHttpMethods.Put |   
CorsHttpMethods.Options; 
corsRule.AllowedHeaders.Add("*"); 
corsRule.ExposedHeaders.Add("*"); 
corsRule.MaxAgeInSeconds = (int)TimeSpan.FromDays(5).TotalSeconds; 
corsRules.Add(corsRule); 
serviceProperty.Cors = corsProperty; 

이 때 작동 다음과 같이 내 고르를 설정하고

{"fullurl":"https://ingenovatebeta.blob.core.windows.net/teeessssttt/7554eb72-f361-4715-a255-a5d6922706b0?sv=2013-08-15&sr=b&sig=iVL4zeytgC1H7W09lV2YZspOKlzF433oqsx9I6cfI68%3D&st=2014-10-24T05%3A58%3A13Z&se=2014-10-24T06%3A18%3A13Z&sp=w","HostingSite":"https://ingenovatebeta.blob.core.windows.net/teeessssttt/7554eb72-f361-4715-a255-a5d6922706b0","id":"7554eb72-f361-4715-a255-a5d6922706b0","Token":"?sv=2013-08-15&sr=b&sig=iVL4zeytgC1H7W09lV2YZspOKlzF433oqsx9I6cfI68%3D&st=2014-10-24T05%3A58%3A13Z&se=2014-10-24T06%3A18%3A13Z&sp=w"} 

:

public SAS(string containername, string id, SharedAccessBlobPermissions permissions) 
{ 
    this.id = id; 
    CloudStorageAccount cloudStorageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString")); 
    CloudBlobContainer containerReference = cloudStorageAccount.CreateCloudBlobClient().GetContainerReference("teeessssttt"); 
    if (containerReference.CreateIfNotExists(null, null)) 
    { 
     BlobConfig.configureCORS(); 
    } 
    CloudBlockBlob blockBlobReference = containerReference.GetBlockBlobReference(id); 
    SharedAccessBlobPolicy sharedAccessBlobPolicy = new SharedAccessBlobPolicy() 
    { 
     Permissions = permissions 
    }; 
    DateTime utcNow = DateTime.UtcNow; 
    sharedAccessBlobPolicy.SharedAccessStartTime = new DateTimeOffset?(utcNow.AddMinutes(-5)); 
    DateTime dateTime = DateTime.UtcNow; 
    sharedAccessBlobPolicy.SharedAccessExpiryTime = new DateTimeOffset?(dateTime.AddMinutes(15)); 
    string sharedAccessSignature = blockBlobReference.GetSharedAccessSignature(sharedAccessBlobPolicy); 
    this.HostingSite = blockBlobReference.Uri.AbsoluteUri; 
    this.Token = sharedAccessSignature; 
    this.fullurl = string.Concat(this.HostingSite, this.Token); 
} 

이 같은 것을 생성 나는 단지 GUID에 파일을 업로드한다. 예를 들어 다음과 같은 작품처럼 내 업로드 URI를 설정 :

$.get("/api/sas", (function (json) {  
    var baseUrl = json.fullurl;         
    myDropzone.options.url = baseUrl; 
    myDropzone.processFile(file); 
})); 

그러나 내 모든 파일을 그냥 GUID의이은 (는) 자기 이미지 등을 검색 할 수없는 파일 이름 또는 확장으로 내 클라우드 스토리지에 끝낸다. 예제에서는 파일 이름을 추가 할 수 있습니다. 나는 예를 따라 갔다 :

$.get("/api/sas", (function (json) { 

    var baseUrl = json.fullurl; 
    var indexOfQueryStart = baseUrl.indexOf("?"); 
    submitUri = baseUrl.substring(0, indexOfQueryStart) + '/' + file.name + baseUrl.substring(indexOfQueryStart); 

    myDropzone.options.url = submitUri; 
    myDropzone.processFile(file); 
})); 

그러나 그것은 작동하지 않는다. 이 시점에서 CORS 오류가 발생합니다.

XMLHttpRequest cannot load https://myurl/mycontainer/82b7f14b-ee7c-45a3…2B%2BmtAJw%3D&st=2014-10-23T04%3A34%3A22Z&se=2014-10-23T04%3A54%3A22Z&sp=w. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://stagingrapidrealities.azurewebsites.net' is therefore not allowed access. The response had HTTP status code 403. ​ 
+0

'submitUri' 변수가 생성되는 방식에 문제가있는 것처럼 보입니다. 실제 submitUri 변수 값을 표시 할 수 있습니까? –

+0

안녕하세요 @ GauravMantri. 지난 며칠 동안 나는 당신의 튜토리얼을 많이 사용 해왔다.그들에게 고마워. 나는 그들을 사랑한다. submitUri의 값은이 pastebin에 있습니다. http://pastebin.com/sWakXxva하면 URL을 여기에 붙여 넣을 수 없습니다. – w3bMak3r

+0

URL이 괜찮은 것 같습니다. baseUrl도 공유 할 수 있습니까? baseUrl에는 GUID도 포함되어 있다고 추측하고 있지만 확인하고 싶습니다. 또한 SAS URL 생성을위한 코드를 공유 할 수 있다면 도움이 될 것입니다. –

답변

1

나는 무슨 일이 일어나고 있는지 알고 있습니다. 기본적으로 CORS 설정에는 아무런 문제가 없습니다. 그들은 완벽하게 괜찮습니다. SAS에 문제가 있습니다.

블로 브에 SAS를 생성하는 경우 (블롭의 이름은 7554eb72-f361-4715-a255-a5d6922706b0). 즉, 계산 된 서명에는이 BLOB 이름이 포함됩니다. 그런 다음 파일을 업로드 할 때 파일 이름 (clown.jpg)을 URL에 추가하여 BLOB 이름을 변경합니다. 이것은 본질적으로 SAS 서명을 무효로 만들었으므로 403 오류가 발생합니다. 사용자의 파일을 선택할 때이 경우, : 당신이을 업로드하고 실제 파일을 기반으로 BLOB에

  1. 계산 SAS :이 문제를 해결할 수있는 방법은 두 가지가 있습니다

    응용 프로그램에서 blob 이름을 서버에 전달하고 해당 파일의 SAS URL을 반환하게하고 바로 사용합니다. 이것이 GUID를 사용하여 파일을 업로드 할 때 코드가 작동 한 이유입니다.

  2. 컨테이너에서 SAS를 계산합니다. : blob에서 SAS를 계산하는 대신 blob 대신 컨테이너에서 계산합니다. 과정은 동일하게 유지됩니다. SAS URL에서 차이점은 b (BLOB을 의미) 대신 src (컨테이너를 의미 함)이 될 것입니다. 그런 다음 submitUrl을 파생시키기 위해 동일한 접근 방식을 사용합니다 (즉, ?의 색인을 찾아 파일 이름을 삽입).

내 권장 사항은 서버에 대한 호출이 적어지기 때문에 # 2로 이동하는 것이 좋습니다. 업로드 페이지에서 컨테이너의 SAS를 한 번만 계산 한 다음 사용자가 파일을 선택하여 업로드 할 때 파일 이름을 계속 삽입하면됩니다. 사실 저는 우리가 작업하고있는 제품 중 하나에서이 방법을 사용하고 있습니다.

+0

정말 고마워요. 오늘 밤 이걸 시험해보고 어떻게 작동하는지 알려주지. 나는 당신의 튜토리얼과 .net 커뮤니티를 위해하는 모든 것을 정말로 고맙게 생각한다. :) – w3bMak3r

관련 문제