3
3
using System . Threading ;
4
4
using System . Threading . Tasks ;
5
5
using Microsoft . Azure . Services . AppAuthentication ;
6
+ using Microsoft . WindowsAzure . Storage ;
6
7
using Microsoft . WindowsAzure . Storage . Auth ;
7
8
using Microsoft . WindowsAzure . Storage . Blob ;
8
9
@@ -12,29 +13,26 @@ internal class BlobAccessor
12
13
{
13
14
protected CloudBlockBlob _blob ;
14
15
15
- public BlobAccessor ( Uri blobUri , string account , string sasToken , bool isPublic )
16
+ private BlobAccessor ( CloudBlockBlob blob )
16
17
{
17
- if ( isPublic )
18
+ _blob = blob ;
19
+ }
20
+
21
+ public static BlobAccessor Create ( Uri blobUri , string account , string sasToken )
22
+ {
23
+ if ( ! string . IsNullOrEmpty ( sasToken ) )
18
24
{
19
- _blob = new CloudBlockBlob ( blobUri ) ;
25
+ var storageCredentials = new StorageCredentials ( account , sasToken ) ;
26
+ var blob = new CloudBlockBlob ( blobUri , storageCredentials ) ;
27
+ return new BlobAccessor ( blob ) ;
20
28
}
21
- else if ( string . IsNullOrEmpty ( sasToken ) )
22
- {
23
- var azureServiceTokenProvider = new AzureServiceTokenProvider ( ) ;
24
- var tokenAndFrequency = TokenRenewerAsync ( azureServiceTokenProvider , CancellationToken . None ) . GetAwaiter ( ) . GetResult ( ) ;
25
- var tokenCredential = new TokenCredential ( tokenAndFrequency . Token ,
26
- TokenRenewerAsync ,
27
- azureServiceTokenProvider ,
28
- tokenAndFrequency . Frequency . Value ) ;
29
29
30
- var storageCredentials = new StorageCredentials ( tokenCredential ) ;
31
- _blob = new CloudBlockBlob ( blobUri , storageCredentials ) ;
32
- }
33
- else
30
+ if ( IsBlobPublic ( blobUri ) . Result )
34
31
{
35
- var storageCredentials = new StorageCredentials ( account , sasToken ) ;
36
- _blob = new CloudBlockBlob ( blobUri , storageCredentials ) ;
32
+ return new BlobAccessor ( new CloudBlockBlob ( blobUri ) ) ;
37
33
}
34
+
35
+ return CreateBlobAccessorWithAAD ( blobUri ) ;
38
36
}
39
37
40
38
public async Task < ( string , bool ) > RetrieveIfUpdated ( MemoryStream ms , string eTag )
@@ -61,10 +59,39 @@ private static async Task<NewTokenAndFrequency> TokenRenewerAsync(object state,
61
59
var next = ( authResult . ExpiresOn - DateTimeOffset . UtcNow ) - TimeSpan . FromMinutes ( 5 ) ;
62
60
if ( next . Ticks < 0 )
63
61
{
64
- next = default ( TimeSpan ) ;
62
+ next = default ;
65
63
}
66
64
67
65
return new NewTokenAndFrequency ( authResult . AccessToken , next ) ;
68
66
}
67
+
68
+ private static async Task < bool > IsBlobPublic ( Uri blobUri )
69
+ {
70
+ try
71
+ {
72
+ // check if the blob can be accessed directly.
73
+ await new CloudBlockBlob ( blobUri ) . FetchAttributesAsync ( ) ;
74
+ }
75
+ catch ( StorageException )
76
+ {
77
+ return false ;
78
+ }
79
+
80
+ return true ;
81
+ }
82
+
83
+ private static BlobAccessor CreateBlobAccessorWithAAD ( Uri blobUri )
84
+ {
85
+ var azureServiceTokenProvider = new AzureServiceTokenProvider ( ) ;
86
+ var tokenAndFrequency = TokenRenewerAsync ( azureServiceTokenProvider , CancellationToken . None ) . GetAwaiter ( ) . GetResult ( ) ;
87
+ var tokenCredential = new TokenCredential ( tokenAndFrequency . Token ,
88
+ TokenRenewerAsync ,
89
+ azureServiceTokenProvider ,
90
+ tokenAndFrequency . Frequency . Value ) ;
91
+
92
+ var storageCredentials = new StorageCredentials ( tokenCredential ) ;
93
+ var blob = new CloudBlockBlob ( blobUri , storageCredentials ) ;
94
+ return new BlobAccessor ( blob ) ;
95
+ }
69
96
}
70
97
}
0 commit comments