2017-08-22 11 views
0

私の主な目標は、ファイルのためにSAS url(紺碧のライブラリなし)を作成することです。 BLOBでazureストレージSASを作成しようとしましたが、すべて正常に動作しました。 Fileで同じことをしようとすると、エラーが出ました。これは私のコードです:紺碧のファイルストレージを作成する方法SAS url(紺碧の図書館なし)?

string azAccName = "AccountName"; 
string resource = "/upgfile/prt.png"; 
string endPoint = "https://" + azAccName + ".file.core.windows.net"; 
string uri = endPoint + resource; 
string _now = DateTime.UtcNow.ToString("s") + "Z";  
string _noww = DateTime.UtcNow.AddHours(3).AddMinutes(5).ToString("s") + "Z"; 
string StorageKey = "xxx"; 

string signedpermissions = "r"; 
string signedstart = _now;//"2017-02-14"; //yyyy-mm--dd 
string signedexpiry = _noww;// "2017-02-14"; 
string canonicalizedresource = "/file/" + azAccName + resource; //"/blob/myaccount/music/intro.mp3" 
string signedidentifier = ""; //YWJjZGVmZw== 
string signedIP = ""; 
string signedProtocol = "https"; 
string signedversion = "2015-02-21"; 
string rscc = ""; //Cache-Control 
string rscd = "file; attachment"; //Content-Disposition    
string rsce = ""; //Content-Encoding 
string rscl = ""; //Content-Language 
string rsct = "binary"; //Content-Type  binary 


string StringToSign = signedpermissions + "\n" + 
       signedstart + "\n" + 
       signedexpiry + "\n" + 
       canonicalizedresource + "\n" + 
       signedidentifier + "\n" + 
       signedversion + "\n" + 
       rscc + "\n" + 
       rscd + "\n" + 
       rsce + "\n" + 
       rscl + "\n" + 
       rsct; 

HMACSHA256 hmac = new HMACSHA256(Convert.FromBase64String(StorageKey)); 
string signature = Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(StringToSign))); 

string link = String.Format("{0}?sv={1}&st={2}&se={3}&sr={4}&sp={5}&rscd={8}&rsct={9}&spr={6}&sig={7}", 
             uri, 
             signedversion, 
             signedstart, 
             signedexpiry, 
             "c", //b for blob 
             signedpermissions, 
             "https", 
             signature.Replace("/", "%2"), 
             rscd,/////////////// 
             rsct); 

このエラーが発生しています。

<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:92eda75a-001a-0072-501d-1bb6fd000000 Time:2017-08-22T08:03:58.6115733Z 
</Message> 
<AuthenticationErrorDetail>Signature fields not well formed.</AuthenticationErrorDetail> 
</Error> 

ブロブ(小差)とほぼ同じコードがあり、正しく動作します。 提案がありますか?

答えて

1

stringToSignのパラメータが欠落していると思います。指定したhereとしてすべてのパラメータを含める必要があります。

StringToSign = signedpermissions + "\n" + 
       signedstart + "\n" + 
       signedexpiry + "\n" + 
       canonicalizedresource + "\n" + 
       signedidentifier + "\n" + 
       signedIP + "\n" + 
       signedProtocol + "\n" + 
       signedversion + "\n" + 
       rscc + "\n" + 
       rscd + "\n" + 
       rsce + "\n" + 
       rscl + "\n" + 
       rsct 

あなたは(あなたの場合の一例signedIPのための)パラメータを使用していない場合は、空の行を指定する必要があります。

これに基づき、あなたのStringToSignは次のようになります。

string StringToSign = signedpermissions + "\n" + 
       signedstart + "\n" + 
       signedexpiry + "\n" + 
       canonicalizedresource + "\n" + 
       signedidentifier + "\n" + 
       "\n" + //For signed IP 
       "\n" + //For signed Protocol 
       signedversion + "\n" + 
       rscc + "\n" + 
       rscd + "\n" + 
       rsce + "\n" + 
       rscl + "\n" + 
       rsct; 

さらにsr(署名済みリソースタイプ)linkに代わりに使用しているcの(ファイル用)fでなければなりません。

+0

ありがとうございます。私の問題はsr(cではなくf)でした。 – kostas

関連する問題