1- // Copyright (c) .NET Foundation. All rights reserved.
1+ // Copyright (c) .NET Foundation. All rights reserved.
22// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
33
44using System ;
@@ -327,37 +327,37 @@ private void ReplaceMetadata(IDictionary<string, string> newMetadata)
327327
328328 public async Task < string > GetSharedAccessSignature ( FileUriPermissions permissions , DateTimeOffset endOfAccess )
329329 {
330- var sasBuilder = new BlobSasBuilder
331- {
332- BlobContainerName = _blob . BlobContainerName ,
333- BlobName = _blob . Name ,
334- Resource = "b" ,
335- StartsOn = DateTimeOffset . UtcNow . AddMinutes ( - 5 ) ,
336- ExpiresOn = endOfAccess ,
337- } ;
338- sasBuilder . SetPermissions ( CloudWrapperHelpers . GetSdkSharedAccessPermissions ( permissions ) ) ;
330+ BlobSasBuilder sasBuilder = CreateSasBuilderWithPermission ( permissions , endOfAccess ) ;
339331
340332 if ( _blob . CanGenerateSasUri )
341333 {
342334 // regular SAS
343335 return _blob . GenerateSasUri ( sasBuilder ) . Query ;
344336 }
345- else if ( _container ? . Account ? . UsingTokenCredential == true && _container ? . Account ? . Client != null )
337+ else if ( IsUsingDelegationSas ( ) )
346338 {
347- // user delegation SAS
348- var userDelegationKey = ( await _container . Account . Client . GetUserDelegationKeyAsync ( sasBuilder . StartsOn , sasBuilder . ExpiresOn ) ) . Value ;
349- var blobUriBuilder = new BlobUriBuilder ( _blob . Uri )
350- {
351- Sas = sasBuilder . ToSasQueryParameters ( userDelegationKey , _blob . AccountName ) ,
352- } ;
353- return blobUriBuilder . ToUri ( ) . Query ;
339+ return await GenerateDelegationSasAsync ( sasBuilder ) ;
354340 }
355341 else
356342 {
357343 throw new InvalidOperationException ( "Unsupported blob authentication" ) ;
358344 }
359345 }
360346
347+ public async Task < string > GetDelegationSasAsync ( FileUriPermissions permissions , DateTimeOffset endOfAccess )
348+ {
349+ BlobSasBuilder sasBuilder = CreateSasBuilderWithPermission ( permissions , endOfAccess ) ;
350+
351+ if ( IsUsingDelegationSas ( ) )
352+ {
353+ return await GenerateDelegationSasAsync ( sasBuilder ) ;
354+ }
355+ else
356+ {
357+ throw new InvalidOperationException ( "Unsupported blob authentication, managed identity required for this method." ) ;
358+ }
359+ }
360+
361361 public async Task StartCopyAsync ( ISimpleCloudBlob source , IAccessCondition sourceAccessCondition , IAccessCondition destAccessCondition )
362362 {
363363 // To avoid this we would need to somehow abstract away the primary and secondary storage locations. This
@@ -531,5 +531,35 @@ private void UpdateEtag(BlobDownloadDetails details)
531531 // workaround for https://github.com/Azure/azure-sdk-for-net/issues/29942
532532 private static string EtagToString ( ETag etag )
533533 => etag . ToString ( "H" ) ;
534+
535+ private BlobSasBuilder CreateSasBuilderWithPermission ( FileUriPermissions permissions , DateTimeOffset endOfAccess )
536+ {
537+ var sasBuilder = new BlobSasBuilder
538+ {
539+ BlobContainerName = _blob . BlobContainerName ,
540+ BlobName = _blob . Name ,
541+ Resource = "b" ,
542+ StartsOn = DateTimeOffset . UtcNow . AddMinutes ( - 5 ) ,
543+ ExpiresOn = endOfAccess ,
544+ } ;
545+ sasBuilder . SetPermissions ( CloudWrapperHelpers . GetSdkSharedAccessPermissions ( permissions ) ) ;
546+
547+ return sasBuilder ;
548+ }
549+
550+ private bool IsUsingDelegationSas ( )
551+ {
552+ return _container ? . Account ? . UsingTokenCredential == true && _container ? . Account ? . Client != null ;
553+ }
554+
555+ private async Task < string > GenerateDelegationSasAsync ( BlobSasBuilder sasBuilder )
556+ {
557+ UserDelegationKey userDelegationKey = ( await _container . Account . Client . GetUserDelegationKeyAsync ( sasBuilder . StartsOn , sasBuilder . ExpiresOn ) ) . Value ;
558+ BlobUriBuilder blobUriBuilder = new BlobUriBuilder ( _blob . Uri )
559+ {
560+ Sas = sasBuilder . ToSasQueryParameters ( userDelegationKey , _blob . AccountName ) ,
561+ } ;
562+ return blobUriBuilder . ToUri ( ) . Query ;
563+ }
534564 }
535- }
565+ }
0 commit comments