22// Licensed under the MIT License.
33
44using System ;
5+ using System . Security . Cryptography ;
6+ using System . Text ;
57using System . Threading . Tasks ;
68using Azure . Core . TestFramework ;
9+ using Azure . Storage . Queues . Models ;
710using Azure . Storage . Queues . Tests ;
811using Azure . Storage . Sas ;
912using Azure . Storage . Test ;
@@ -21,6 +24,41 @@ public QueueSasBuilderTests(bool async, QueueClientOptions.ServiceVersion servic
2124 {
2225 }
2326
27+ [ RecordedTest ]
28+ public void QueueSasBuilder_ToSasQueryParameters_IdentitySas ( )
29+ {
30+ // Arrange
31+ var constants = TestConstants . Create ( this ) ;
32+ string queueName = GetNewQueueName ( ) ;
33+ QueueSasBuilder queueSasBuilder = BuildQueueSasBuilder ( constants , queueName ) ;
34+ string signature = BuildUserDelegationSignature ( constants , queueName ) ;
35+ string stringToSign = null ;
36+
37+ // Act
38+ QueueSasQueryParameters sasQueryParameters = queueSasBuilder . ToSasQueryParameters ( GetUserDelegationKey ( constants ) , constants . Sas . Account , out stringToSign ) ;
39+
40+ // Assert
41+ Assert . AreEqual ( SasQueryParametersInternals . DefaultSasVersionInternal , sasQueryParameters . Version ) ;
42+ Assert . IsNull ( sasQueryParameters . Services ) ;
43+ Assert . IsNull ( sasQueryParameters . ResourceTypes ) ;
44+ Assert . AreEqual ( constants . Sas . Protocol , sasQueryParameters . Protocol ) ;
45+ Assert . AreEqual ( constants . Sas . StartTime , sasQueryParameters . StartsOn ) ;
46+ Assert . AreEqual ( constants . Sas . ExpiryTime , sasQueryParameters . ExpiresOn ) ;
47+ Assert . AreEqual ( constants . Sas . IPRange , sasQueryParameters . IPRange ) ;
48+ Assert . AreEqual ( String . Empty , sasQueryParameters . Identifier ) ;
49+ Assert . AreEqual ( constants . Sas . KeyObjectId , sasQueryParameters . KeyObjectId ) ;
50+ Assert . AreEqual ( constants . Sas . KeyTenantId , sasQueryParameters . KeyTenantId ) ;
51+ Assert . AreEqual ( constants . Sas . KeyStart , sasQueryParameters . KeyStartsOn ) ;
52+ Assert . AreEqual ( constants . Sas . KeyExpiry , sasQueryParameters . KeyExpiresOn ) ;
53+ Assert . AreEqual ( constants . Sas . KeyService , sasQueryParameters . KeyService ) ;
54+ Assert . AreEqual ( constants . Sas . KeyVersion , sasQueryParameters . KeyVersion ) ;
55+ Assert . AreEqual ( Constants . Sas . Resource . Queue , sasQueryParameters . Resource ) ;
56+ Assert . AreEqual ( Permissions , sasQueryParameters . Permissions ) ;
57+ Assert . AreEqual ( constants . Sas . DelegatedObjectId , sasQueryParameters . DelegatedUserObjectId ) ;
58+ Assert . AreEqual ( signature , sasQueryParameters . Signature ) ;
59+ Assert . IsNotNull ( stringToSign ) ;
60+ }
61+
2462 [ RecordedTest ]
2563 public void QueueSasBuilder_ToSasQueryParameters_VersionTest ( )
2664 {
@@ -285,6 +323,7 @@ private QueueSasBuilder BuildQueueSasBuilder(TestConstants constants, string que
285323 IPRange = constants . Sas . IPRange ,
286324 Identifier = constants . Sas . Identifier ,
287325 QueueName = queueName ,
326+ DelegatedUserObjectId = constants . Sas . DelegatedObjectId ,
288327 } ;
289328 queueSasBuilder . SetPermissions ( Permissions ) ;
290329
@@ -305,5 +344,45 @@ private string BuildSignature(TestConstants constants, string queueName)
305344
306345 return StorageSharedKeyCredentialInternals . ComputeSasSignature ( constants . Sas . SharedKeyCredential , stringToSign ) ;
307346 }
347+
348+ private string BuildUserDelegationSignature ( TestConstants constants , string queueName )
349+ {
350+ var stringToSign = string . Join ( "\n " ,
351+ Permissions ,
352+ SasExtensions . FormatTimesForSasSigning ( constants . Sas . StartTime ) ,
353+ SasExtensions . FormatTimesForSasSigning ( constants . Sas . ExpiryTime ) ,
354+ "/queue/" + constants . Sas . Account + "/" + queueName ,
355+ constants . Sas . KeyObjectId ,
356+ constants . Sas . KeyTenantId ,
357+ SasExtensions . FormatTimesForSasSigning ( constants . Sas . KeyStart ) ,
358+ SasExtensions . FormatTimesForSasSigning ( constants . Sas . KeyExpiry ) ,
359+ constants . Sas . KeyService ,
360+ constants . Sas . KeyVersion ,
361+ null ,
362+ constants . Sas . DelegatedObjectId ,
363+ constants . Sas . IPRange . ToString ( ) ,
364+ SasExtensions . ToProtocolString ( SasProtocol . Https ) ,
365+ SasQueryParametersInternals . DefaultSasVersionInternal ) ;
366+
367+ return ComputeHMACSHA256 ( constants . Sas . KeyValue , stringToSign ) ;
368+ }
369+
370+ private string ComputeHMACSHA256 ( string userDelegationKeyValue , string message ) =>
371+ Convert . ToBase64String (
372+ new HMACSHA256 (
373+ Convert . FromBase64String ( userDelegationKeyValue ) )
374+ . ComputeHash ( Encoding . UTF8 . GetBytes ( message ) ) ) ;
375+
376+ private static UserDelegationKey GetUserDelegationKey ( TestConstants constants )
377+ => new UserDelegationKey
378+ {
379+ SignedObjectId = constants . Sas . KeyObjectId ,
380+ SignedTenantId = constants . Sas . KeyTenantId ,
381+ SignedStartsOn = constants . Sas . KeyStart ,
382+ SignedExpiresOn = constants . Sas . KeyExpiry ,
383+ SignedService = constants . Sas . KeyService ,
384+ SignedVersion = constants . Sas . KeyVersion ,
385+ Value = constants . Sas . KeyValue
386+ } ;
308387 }
309388}
0 commit comments