如何创建 Azure 文件存储 SAS url(没有 Azure 库)?
How to create azure file storage SAS url(without azure libraries)?
我的主要目标是为文件创建一个 SAS url(没有 azure 库)。
我尝试使用 blob 创建 azure storage SAS,一切正常。当我尝试在文件中做同样的事情时,我得到了一个错误。这是我的代码:
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>
我有几乎相同的 blob 代码(细微差别)并且它工作正常。
有什么建议吗?
我认为问题是您的 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;
此外,link
中的 sr
(签名资源类型)应该是 f
(对于文件),而不是您正在使用的 c
。
我的主要目标是为文件创建一个 SAS url(没有 azure 库)。 我尝试使用 blob 创建 azure storage SAS,一切正常。当我尝试在文件中做同样的事情时,我得到了一个错误。这是我的代码:
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>
我有几乎相同的 blob 代码(细微差别)并且它工作正常。 有什么建议吗?
我认为问题是您的 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;
此外,link
中的 sr
(签名资源类型)应该是 f
(对于文件),而不是您正在使用的 c
。