I'm trying to implement shared access signatures when saving blobs (pdf files) to azure blob storage. I want the link to the pdf file to expire after a set time, but it doesn't seem to be working.
The pdf creation and save process works fine, I create a pdf file and upload it to azure blob storage. I can retrieve the blob URL and if I paste it into a browser, the pdf report shows up ok. It never expires though.
I set the expiry time to 2 minutes while Im testing (it would be around 24 hours in production). I can continue to view the report, nothing stops me.
I am new to shared signature access, but from what I've found so far, it is supposed to stop access after the specified time(is this correct?).
This is how I create the storage details (in the constructor of my class):
public BlobService()
{
//use for local development testing
_connectionString = Settings.AzureWebJobsStorage;
this._container = Settings.ReportBlobContainer;
try
{
storageAccount = CloudStorageAccount.Parse(_connectionString);
}
catch (StorageException e)
{
throw;
}
// Get an account SAS token.
string sasToken = GetAccountSASToken();
// Use the account SAS token to create authentication credentials.
StorageCredentials accountSAS = new StorageCredentials(sasToken);
var blobClient = storageAccount.CreateCloudBlobClient();
chpBlobContainer = blobClient.GetContainerReference(this._container);
// Get the URI for the container.
Uri containerUri = GetContainerUri();
chpBlobContainer = new CloudBlobContainer(containerUri, accountSAS);
try
{
if (chpBlobContainer.CreateIfNotExists())
{
//leave the access to private only (default)
// Enable public access on the newly created container.
//chpBlobContainer.SetPermissions(
// new BlobContainerPermissions
// {
// PublicAccess = BlobContainerPublicAccessType.Blob
// });
}
}
catch(Exception ex)
{
var tmp = ex.Message;
}
}
and this is how I generate the SAS token
private string GetAccountSASToken()
{
// Retrieve storage account information from connection string
//CloudStorageAccount storageAccount = Common.CreateStorageAccountFromConnectionString();
// Create a new access policy for the account with the following properties:
// Permissions: Read, Write, List, Create, Delete
// ResourceType: Container
// Expires in 24 hours
// Protocols: HTTPS or HTTP (note that the storage emulator does not support HTTPS)
SharedAccessAccountPolicy policy = new SharedAccessAccountPolicy()
{
// When the start time for the SAS is omitted, the start time is assumed to be the time when the storage service receives the request.
// Omitting the start time for a SAS that is effective immediately helps to avoid clock skew.
//Permissions = SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Write | SharedAccessAccountPermissions.List | SharedAccessAccountPermissions.Create | SharedAccessAccountPermissions.Delete,
Permissions = SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Write | SharedAccessAccountPermissions.Create,
Services = SharedAccessAccountServices.Blob,
ResourceTypes = SharedAccessAccountResourceTypes.Container | SharedAccessAccountResourceTypes.Object,
//SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24),
//just for testing the expiry works
SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(2),
Protocols = SharedAccessProtocol.HttpsOrHttp
};
// Create new storage credentials using the SAS token.
string sasToken = storageAccount.GetSharedAccessSignature(policy);
// Return the SASToken
return sasToken;
}
I can see the blob from the Azure storage explorer, so the connection and generation process is fine, its just the expiry.
Can anyone help me out? I am clearly doing something wrong here.
Private
. Can you please check that? Also, if possible please share the SAS URL. - Gaurav Mantri