Athlectual 的回复似乎不适用于当前的 openstack.net NuGet 包,但我已经通过反复试验设法让它与最新版本 (1.1.2.1) 一起使用。希望这对其他人有帮助
在我的情况下,我似乎不必设置临时 URL 元数据密钥,因为已经设置了一个,必须在创建帐户时随机生成。因此,获取有效临时 URL 的代码如下。
注意我已经使用用户名和 APIKey 进行身份验证。我想您可以改用密码。APIKey 可以在 Rackspace 云控制面板网站的帐户详细信息下找到。
private static string GetCloudFilesTempUrl(Uri storageUrl, string username, string apiKey, string containerName, string filename)
{
var cloudIdentity = new CloudIdentity()
{
Username = username,
APIKey = apiKey
};
var provider = new CloudFilesProvider(cloudIdentity);
var accountMetaData = provider.GetAccountMetaData();
var tempUrlKey = accountMetaData["Temp-Url-Key"];
//Set the link to expire after 60 seconds (in epoch time)
var epochExpire = ((int) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds) + 60;
//The path to the cloud file
var path = string.Format("{0}/{1}/{2}", storageUrl.AbsolutePath, containerName, filename);
var hmacBody = string.Format("GET\n{0}\n{1}", epochExpire, path);
var hashSaltBytes = Encoding.ASCII.GetBytes(tempUrlKey);
string sig;
using (var myhmacMd5 = new HMACSHA1(hashSaltBytes))
{
var ticketBytes = Encoding.ASCII.GetBytes(hmacBody);
var checksum = myhmacMd5.ComputeHash(ticketBytes);
var hexaHash = new StringBuilder();
foreach (var b in checksum)
{
hexaHash.Append(String.Format("{0:x2}", b));
}
sig = hexaHash.ToString();
}
var cloudFileUrl = string.Format("https://{0}{1}", storageUrl.Host, path);
//Compile the temporary URL
return string.Format("{0}?temp_url_sig={1}&temp_url_expires={2}", cloudFileUrl, sig, epochExpire);
}
我不确定您打算如何获取存储 URL,但通过更多的试验和错误,我设法做到了这一点:
private static string GetCloudFilesStorageUrl(string username, string apiKey)
{
var cloudIdentity = new CloudIdentity()
{
Username = username,
APIKey = apiKey
};
var identityProvider = new CloudIdentityProvider(cloudIdentity);
return identityProvider.GetUserAccess(cloudIdentity)
.ServiceCatalog
.Single(x => x.Name == "cloudFiles")
.Endpoints[0].PublicURL;
}
如前所述,我不必设置临时 URL 密钥,而且我可能不会尝试以防我破坏了一些有效的东西!如果您需要,我猜以下应该可以解决问题:
private static void SetCloudFilesTempUrlKey(string username, string apiKey, string tempUrlKey)
{
var cloudIdentity = new CloudIdentity()
{
Username = username,
APIKey = apiKey
};
var provider = new CloudFilesProvider(cloudIdentity);
provider.UpdateAccountMetadata(new Metadata
{
{ "Temp-Url-Key", tempUrlKey }
});
}