BlobSasBuilder
BlobSasBuilder is used to generate a Shared Access
Signature (SAS) for an Azure Storage container or blob.
For more information, see
Create a service SAS.
using Azure.Core;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System;
using System.ComponentModel;
using System.Security.Cryptography;
using System.Text;
namespace Azure.Storage.Sas
{
public class BlobSasBuilder
{
[EditorBrowsable(EditorBrowsableState.Never)]
public string Version { get; set; }
public SasProtocol Protocol { get; set; }
public DateTimeOffset StartsOn { get; set; }
public DateTimeOffset ExpiresOn { get; set; }
public string Permissions { get; set; }
public SasIPRange IPRange { get; set; }
public string Identifier { get; set; }
public string BlobContainerName { get; set; }
public string BlobName { get; set; }
public string Snapshot { get; set; }
public string BlobVersionId { get; set; }
public string Resource { get; set; }
public string CacheControl { get; set; }
public string ContentDisposition { get; set; }
public string ContentEncoding { get; set; }
public string ContentLanguage { get; set; }
public string ContentType { get; set; }
public string { get; set; }
public string CorrelationId { get; set; }
public string EncryptionScope { get; set; }
[EditorBrowsable(EditorBrowsableState.Never)]
public BlobSasBuilder()
{
}
public BlobSasBuilder(BlobSasPermissions permissions, DateTimeOffset expiresOn)
{
ExpiresOn = expiresOn;
SetPermissions(permissions);
}
public BlobSasBuilder(BlobContainerSasPermissions permissions, DateTimeOffset expiresOn)
{
ExpiresOn = expiresOn;
SetPermissions(permissions);
}
public void SetPermissions(BlobSasPermissions permissions)
{
Permissions = permissions.ToPermissionsString();
}
public void SetPermissions(BlobAccountSasPermissions permissions)
{
Permissions = permissions.ToPermissionsString();
}
public void SetPermissions(BlobContainerSasPermissions permissions)
{
Permissions = permissions.ToPermissionsString();
}
public void SetPermissions(SnapshotSasPermissions permissions)
{
Permissions = permissions.ToPermissionsString();
}
public void SetPermissions(BlobVersionSasPermissions permissions)
{
Permissions = permissions.ToPermissionsString();
}
public void SetPermissions(string rawPermissions, bool normalize = false)
{
if (normalize)
rawPermissions = SasExtensions.ValidateAndSanitizeRawPermissions(rawPermissions, Constants.Sas.ValidPermissionsInOrder);
SetPermissions(rawPermissions);
}
public void SetPermissions(string rawPermissions)
{
Permissions = rawPermissions;
}
[Azure.Core.CallerShouldAudit("https://aka.ms/azsdk/callershouldaudit/storage-blobs")]
public BlobSasQueryParameters (StorageSharedKeyCredential sharedKeyCredential)
{
string stringToSign;
return ToSasQueryParameters(sharedKeyCredential, out stringToSign);
}
[Azure.Core.CallerShouldAudit("https://aka.ms/azsdk/callershouldaudit/storage-blobs")]
public BlobSasQueryParameters (StorageSharedKeyCredential sharedKeyCredential, out string stringToSign)
{
StorageSharedKeyCredential obj = sharedKeyCredential;
if (obj == null)
throw Errors.ArgumentNull("sharedKeyCredential");
sharedKeyCredential = obj;
EnsureState();
stringToSign = ToStringToSign(sharedKeyCredential);
string text = StorageSharedKeyCredentialInternals.ComputeSasSignature(sharedKeyCredential, stringToSign);
string version = Version;
SasProtocol protocol = Protocol;
DateTimeOffset startsOn = StartsOn;
DateTimeOffset expiresOn = ExpiresOn;
SasIPRange iPRange = IPRange;
string identifier = Identifier;
string resource = Resource;
string permissions = Permissions;
string signature = text;
string cacheControl = CacheControl;
string contentDisposition = ContentDisposition;
string contentEncoding = ContentEncoding;
string contentLanguage = ContentLanguage;
string contentType = ContentType;
string encryptionScope = EncryptionScope;
return new BlobSasQueryParameters(version, null, null, protocol, startsOn, expiresOn, iPRange, identifier, resource, permissions, signature, null, null, default(DateTimeOffset), default(DateTimeOffset), null, null, cacheControl, contentDisposition, contentEncoding, contentLanguage, contentType, null, null, null, encryptionScope);
}
private string (StorageSharedKeyCredential sharedKeyCredential)
{
string text = SasExtensions.FormatTimesForSasSigning(StartsOn);
string text2 = SasExtensions.FormatTimesForSasSigning(ExpiresOn);
string[] obj = new string[16] {
Permissions,
text,
text2,
GetCanonicalName(sharedKeyCredential.get_AccountName(), BlobContainerName ?? string.Empty, BlobName ?? string.Empty),
Identifier,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null
};
SasIPRange iPRange = IPRange;
obj[5] = ((object)iPRange).ToString();
obj[6] = Protocol.ToProtocolString();
obj[7] = Version;
obj[8] = Resource;
obj[9] = (Snapshot ?? BlobVersionId);
obj[10] = EncryptionScope;
obj[11] = CacheControl;
obj[12] = ContentDisposition;
obj[13] = ContentEncoding;
obj[14] = ContentLanguage;
obj[15] = ContentType;
return string.Join("\n", obj);
}
[Azure.Core.CallerShouldAudit("https://aka.ms/azsdk/callershouldaudit/storage-blobs")]
public BlobSasQueryParameters ToSasQueryParameters(UserDelegationKey userDelegationKey, string accountName)
{
string stringToSign;
return ToSasQueryParameters(userDelegationKey, accountName, out stringToSign);
}
[Azure.Core.CallerShouldAudit("https://aka.ms/azsdk/callershouldaudit/storage-blobs")]
public BlobSasQueryParameters ToSasQueryParameters(UserDelegationKey userDelegationKey, string accountName, out string stringToSign)
{
UserDelegationKey userDelegationKey2 = userDelegationKey;
if (userDelegationKey2 == null)
throw Errors.ArgumentNull("userDelegationKey");
userDelegationKey = userDelegationKey2;
EnsureState();
stringToSign = ToStringToSign(userDelegationKey, accountName);
string signature = ComputeHMACSHA256(userDelegationKey.Value, stringToSign);
string version = Version;
SasProtocol protocol = Protocol;
DateTimeOffset startsOn = StartsOn;
DateTimeOffset expiresOn = ExpiresOn;
SasIPRange iPRange = IPRange;
string resource = Resource;
string permissions = Permissions;
string signedObjectId = userDelegationKey.SignedObjectId;
string signedTenantId = userDelegationKey.SignedTenantId;
DateTimeOffset signedStartsOn = userDelegationKey.SignedStartsOn;
DateTimeOffset signedExpiresOn = userDelegationKey.SignedExpiresOn;
string signedService = userDelegationKey.SignedService;
string signedVersion = userDelegationKey.SignedVersion;
return new BlobSasQueryParameters(version, null, null, protocol, startsOn, expiresOn, iPRange, null, resource, permissions, signature, signedObjectId, signedTenantId, signedStartsOn, signedExpiresOn, signedService, signedVersion, CacheControl, ContentDisposition, ContentEncoding, ContentLanguage, ContentType, PreauthorizedAgentObjectId, null, CorrelationId, EncryptionScope);
}
private string ToStringToSign(UserDelegationKey userDelegationKey, string accountName)
{
string text = SasExtensions.FormatTimesForSasSigning(StartsOn);
string text2 = SasExtensions.FormatTimesForSasSigning(ExpiresOn);
string text3 = SasExtensions.FormatTimesForSasSigning(userDelegationKey.SignedStartsOn);
string text4 = SasExtensions.FormatTimesForSasSigning(userDelegationKey.SignedExpiresOn);
string[] obj = new string[26] {
Permissions,
text,
text2,
GetCanonicalName(accountName, BlobContainerName ?? string.Empty, BlobName ?? string.Empty),
userDelegationKey.SignedObjectId,
userDelegationKey.SignedTenantId,
text3,
text4,
userDelegationKey.SignedService,
userDelegationKey.SignedVersion,
PreauthorizedAgentObjectId,
null,
CorrelationId,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null,
null
};
SasIPRange iPRange = IPRange;
obj[15] = ((object)iPRange).ToString();
obj[16] = Protocol.ToProtocolString();
obj[17] = Version;
obj[18] = Resource;
obj[19] = (Snapshot ?? BlobVersionId);
obj[20] = EncryptionScope;
obj[21] = CacheControl;
obj[22] = ContentDisposition;
obj[23] = ContentEncoding;
obj[24] = ContentLanguage;
obj[25] = ContentType;
return string.Join("\n", obj);
}
private static string GetCanonicalName(string account, string containerName, string blobName)
{
if (string.IsNullOrEmpty(blobName))
return "/blob/" + account + "/" + containerName;
return "/blob/" + account + "/" + containerName + "/" + blobName.Replace("\\", "/");
}
private static string ComputeHMACSHA256(string userDelegationKeyValue, string message)
{
return Convert.ToBase64String(new HMACSHA256(Convert.FromBase64String(userDelegationKeyValue)).ComputeHash(Encoding.UTF8.GetBytes(message)));
}
private void EnsureState()
{
if (Identifier == null) {
if (ExpiresOn == default(DateTimeOffset))
throw Errors.SasMissingData("ExpiresOn");
if (string.IsNullOrEmpty(Permissions))
throw Errors.SasMissingData("Permissions");
}
if (string.IsNullOrEmpty(BlobName))
Resource = "c";
else if (string.IsNullOrEmpty(Snapshot) && string.IsNullOrEmpty(BlobVersionId)) {
Resource = "b";
} else if (string.IsNullOrEmpty(BlobVersionId)) {
Resource = "bs";
} else {
Resource = "bv";
}
Version = SasQueryParametersInternals.DefaultSasVersionInternal;
}
[EditorBrowsable(EditorBrowsableState.Never)]
public override string ToString()
{
return base.ToString();
}
[EditorBrowsable(EditorBrowsableState.Never)]
public override bool Equals(object obj)
{
return base.Equals(obj);
}
[EditorBrowsable(EditorBrowsableState.Never)]
public override int GetHashCode()
{
return base.GetHashCode();
}
internal static BlobSasBuilder DeepCopy(BlobSasBuilder originalBlobSasBuilder)
{
return new BlobSasBuilder {
Version = originalBlobSasBuilder.Version,
Protocol = originalBlobSasBuilder.Protocol,
StartsOn = originalBlobSasBuilder.StartsOn,
ExpiresOn = originalBlobSasBuilder.ExpiresOn,
Permissions = originalBlobSasBuilder.Permissions,
IPRange = originalBlobSasBuilder.IPRange,
Identifier = originalBlobSasBuilder.Identifier,
BlobContainerName = originalBlobSasBuilder.BlobContainerName,
BlobName = originalBlobSasBuilder.BlobName,
Snapshot = originalBlobSasBuilder.Snapshot,
BlobVersionId = originalBlobSasBuilder.BlobVersionId,
Resource = originalBlobSasBuilder.Resource,
CacheControl = originalBlobSasBuilder.CacheControl,
ContentDisposition = originalBlobSasBuilder.ContentDisposition,
ContentEncoding = originalBlobSasBuilder.ContentEncoding,
ContentLanguage = originalBlobSasBuilder.ContentLanguage,
ContentType = originalBlobSasBuilder.ContentType,
PreauthorizedAgentObjectId = originalBlobSasBuilder.PreauthorizedAgentObjectId,
CorrelationId = originalBlobSasBuilder.CorrelationId,
EncryptionScope = originalBlobSasBuilder.EncryptionScope
};
}
}
}