From 9981a8cb3e6dcc16562c34a92f2d8859f6edd7bd Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 11:45:48 +1000 Subject: [PATCH 01/10] Updated UI with sign-in/out buttons, signed-in user status, message display. --- app/HealthyHabitat/Views/MainWindow.xaml | 89 ++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/app/HealthyHabitat/Views/MainWindow.xaml b/app/HealthyHabitat/Views/MainWindow.xaml index 286b135..7bfbb50 100644 --- a/app/HealthyHabitat/Views/MainWindow.xaml +++ b/app/HealthyHabitat/Views/MainWindow.xaml @@ -243,5 +243,94 @@ + + + + + + + + + From 6365ad1f0729d0e837315b296914f4eb23bd5f08 Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 11:51:08 +1000 Subject: [PATCH 02/10] Added UI controls for sign-in/out buttons, singed in-user status, message display. --- .../ViewModels/MainWindowViewModel.cs | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs index 1835c5f..74cedaa 100644 --- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs +++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs @@ -137,6 +137,50 @@ public bool LocationDialogVisible } } + private bool _signInButtonVisible; + public bool SignInButtonVisible + { + get { return _signInButtonVisible; } + set + { + _signInButtonVisible = value; + RaisePropertyChanged("SignInButtonVisible"); + } + } + + private bool _signOutButtonVisible; + public bool SignOutButtonVisible + { + get { return _signOutButtonVisible; } + set + { + _signOutButtonVisible = value; + RaisePropertyChanged("SignOutButtonVisible"); + } + } + + private string _signedInUserName; + public string SignedInUserName + { + get { return _signedInUserName; } + set + { + _signedInUserName = value; + RaisePropertyChanged("SignedInUserName"); + } + } + + private string _displayMessage; + public string DisplayMessage + { + get { return _displayMessage; } + set + { + _displayMessage = value; + RaisePropertyChanged("DisplayMessage"); + } + } + public MainWindowViewModel(IDialogService dialogService) { NameValueCollection locationSection = (NameValueCollection)ConfigurationManager.GetSection("locations"); From 282d6637a7af60e9b96c3f2cea70f3e4c0e3b2e5 Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 11:57:51 +1000 Subject: [PATCH 03/10] Added sign-in/out commands. --- .../ViewModels/MainWindowViewModel.cs | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs index 74cedaa..cba6146 100644 --- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs +++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs @@ -48,6 +48,18 @@ public RelayCommand DropCommand private set; } + public RelayCommand SignInCommand + { + get; + private set; + } + + public RelayCommand SignOutCommand + { + get; + private set; + } + public ICommand ShowMessageBoxWithMessageCommand { get; } #endregion Commands @@ -219,6 +231,18 @@ public MainWindowViewModel(IDialogService dialogService) LocationDialogVisible = true; }); + + SignInCommand = new RelayCommand(async () => + { + await Authorize(); + DisplayBasicTokenInfo(); + }); + + SignOutCommand = new RelayCommand(async () => + { + await DeAuthorize(); + DisplayBasicTokenInfo(); + }); } private async void CopyFilesToLocalCache(string[] files, string location, string season) From f31bb7b80f9c7451fcf5fc86bd6402af27de516b Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 15:30:07 +1000 Subject: [PATCH 04/10] Added auth definitions and init. --- app/HealthyHabitat/HealthyHabitat.csproj | 6 ++++ .../ViewModels/MainWindowViewModel.cs | 32 ++++++++++++++++--- app/HealthyHabitat/packages.config | 4 +++ 3 files changed, 38 insertions(+), 4 deletions(-) diff --git a/app/HealthyHabitat/HealthyHabitat.csproj b/app/HealthyHabitat/HealthyHabitat.csproj index dc899d1..98d3de7 100644 --- a/app/HealthyHabitat/HealthyHabitat.csproj +++ b/app/HealthyHabitat/HealthyHabitat.csproj @@ -60,6 +60,9 @@ ..\packages\Microsoft.Azure.Storage.Common.11.1.0\lib\net452\Microsoft.Azure.Storage.Common.dll + + ..\packages\Microsoft.Identity.Client.4.4.0\lib\net45\Microsoft.Identity.Client.dll + ..\packages\MvvmDialogs.5.3.0\lib\net45\MvvmDialogs.dll @@ -69,6 +72,9 @@ + + + ..\packages\MvvmLightLibs.5.4.1.1\lib\net45\System.Windows.Interactivity.dll diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs index cba6146..d4e1bb9 100644 --- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs +++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs @@ -20,6 +20,7 @@ using System.Threading.Tasks; using System.Windows; using System.Windows.Input; + using Microsoft.Identity.Client; public class MainWindowViewModel : ViewModelBase { @@ -193,8 +194,31 @@ public string DisplayMessage } } + // Auth definitions ------------------------------------------------------------------- + private readonly string ClientId = "18dd432c-1e9e-4da7-93f6-f7d60e3ea712"; // ToDo: ConfigurationManager.AppSettings["ClientID"].ToString() + private readonly string ClientScopes = "user.read https://storage.azure.com/user_impersonation"; // ToDo: ConfigurationManager.AppSettings["ClientScopes"].ToString() + + private IPublicClientApplication PublicClientApp { get; set; } + private AuthenticationResult AuthResult { get; set; } + + // End Auth definitions ------------------------------------------------------------------- + public MainWindowViewModel(IDialogService dialogService) { + // Auth init ------------------------------------------------------------------- + SignInButtonVisible = true; + DisplayMessage = "Please sign in to continue"; + SignedInUserName = ""; + PublicClientApp = PublicClientApplicationBuilder.Create(ClientId) + .WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs) + .WithLogging((level, message, containsPii) => + { + Debug.WriteLine($"MSAL: {level} {message} "); + }, Microsoft.Identity.Client.LogLevel.Warning, enablePiiLogging: false, enableDefaultPlatformLogging: true) + .Build(); + + // End Auth init ------------------------------------------------------------------- + NameValueCollection locationSection = (NameValueCollection)ConfigurationManager.GetSection("locations"); Locations = new ObservableCollection(); @@ -234,14 +258,14 @@ public MainWindowViewModel(IDialogService dialogService) SignInCommand = new RelayCommand(async () => { - await Authorize(); - DisplayBasicTokenInfo(); + //await Authorize(); + //DisplayBasicTokenInfo(); }); SignOutCommand = new RelayCommand(async () => { - await DeAuthorize(); - DisplayBasicTokenInfo(); + //await DeAuthorize(); + //DisplayBasicTokenInfo(); }); } diff --git a/app/HealthyHabitat/packages.config b/app/HealthyHabitat/packages.config index 9ad31ba..c69ea12 100644 --- a/app/HealthyHabitat/packages.config +++ b/app/HealthyHabitat/packages.config @@ -4,7 +4,11 @@ + + + + \ No newline at end of file From 3ab814721c2ca1c68cf8994a83378c40685096ac Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 15:34:02 +1000 Subject: [PATCH 05/10] Added auth async tasks. --- .../ViewModels/MainWindowViewModel.cs | 85 ++++++++++++++++++- 1 file changed, 81 insertions(+), 4 deletions(-) diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs index d4e1bb9..25c009c 100644 --- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs +++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs @@ -258,17 +258,94 @@ public MainWindowViewModel(IDialogService dialogService) SignInCommand = new RelayCommand(async () => { - //await Authorize(); - //DisplayBasicTokenInfo(); + await Authorize(); + DisplayBasicTokenInfo(); }); SignOutCommand = new RelayCommand(async () => { - //await DeAuthorize(); - //DisplayBasicTokenInfo(); + await DeAuthorize(); + DisplayBasicTokenInfo(); }); } + // Auth ------------------------------------------------------------------- + private async Task Authorize() + { + AuthResult = null; + + // It's good practice to not do work on the UI thread, so use ConfigureAwait(false) whenever possible. + IEnumerable accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(true); + IAccount firstAccount = accounts.FirstOrDefault(); + + try + { + AuthResult = await PublicClientApp.AcquireTokenSilent(ClientScopes.Split(), firstAccount) + .ExecuteAsync(); + } + catch (MsalUiRequiredException ex) + { + // A MsalUiRequiredException happened on AcquireTokenSilentAsync. This indicates you need to call AcquireTokenAsync to acquire a token + System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}"); + + try + { + AuthResult = await PublicClientApp.AcquireTokenInteractive(ClientScopes.Split()) + .ExecuteAsync() + .ConfigureAwait(false); + } + catch (MsalException msalex) + { + DisplayMessage = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}"; + } + } + catch (Exception ex) + { + DisplayMessage = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}"; + return; + } + + if (AuthResult != null) + { + SignedInUserName = $"Signed in as: {AuthResult.Account.Username}"; + SignInButtonVisible = false; + SignOutButtonVisible = true; + } + } + + private async Task DeAuthorize() + { + IEnumerable accounts = await PublicClientApp.GetAccountsAsync().ConfigureAwait(false); + IAccount firstAccount = accounts.FirstOrDefault(); + + try + { + await PublicClientApp.RemoveAsync(firstAccount).ConfigureAwait(false); + AuthResult = null; + SignedInUserName = ""; + SignOutButtonVisible = false; + SignInButtonVisible = true; + } + catch (MsalException ex) + { + DisplayMessage = $"Error signing-out user: {ex.Message}"; + } + } + + public void DisplayBasicTokenInfo() + { + if (AuthResult != null) + { + DisplayMessage = $"User Name: {AuthResult.Account.Username}" + Environment.NewLine + $"Token Expires: {AuthResult.ExpiresOn.ToLocalTime()}"; + } + else + { + DisplayMessage = "You have been signed out. Please sign in to continue"; + } + } + + // End Auth ------------------------------------------------------------------- + private async void CopyFilesToLocalCache(string[] files, string location, string season) { From 82cc672aaa8687c20b4a2af667611843194e3adc Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 18:37:00 +1000 Subject: [PATCH 06/10] Added CreateStorageContainer and CreateStorageBlobs so uploads use signed-in user's token (not enabled yet). --- .../ViewModels/MainWindowViewModel.cs | 143 +++++++++++++++++- 1 file changed, 139 insertions(+), 4 deletions(-) diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs index 25c009c..8581c32 100644 --- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs +++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs @@ -21,6 +21,7 @@ using System.Windows; using System.Windows.Input; using Microsoft.Identity.Client; + using Microsoft.Azure.Storage.Auth; public class MainWindowViewModel : ViewModelBase { @@ -207,7 +208,7 @@ public MainWindowViewModel(IDialogService dialogService) { // Auth init ------------------------------------------------------------------- SignInButtonVisible = true; - DisplayMessage = "Please sign in to continue"; + DisplayMessage = "Please sign in."; SignedInUserName = ""; PublicClientApp = PublicClientApplicationBuilder.Create(ClientId) .WithAuthority(AadAuthorityAudience.AzureAdMultipleOrgs) @@ -336,11 +337,11 @@ public void DisplayBasicTokenInfo() { if (AuthResult != null) { - DisplayMessage = $"User Name: {AuthResult.Account.Username}" + Environment.NewLine + $"Token Expires: {AuthResult.ExpiresOn.ToLocalTime()}"; + DisplayMessage = $"User Name: {AuthResult.Account.Username}" + Environment.NewLine + $"Token Expires: {AuthResult.ExpiresOn.ToLocalTime()}" + Environment.NewLine; } else { - DisplayMessage = "You have been signed out. Please sign in to continue"; + DisplayMessage = "You have been signed out."; } } @@ -397,11 +398,145 @@ private async void CopyFilesToLocalCache(string[] files, string location, string string[] subFolders = Directory.GetDirectories(cacheLocation); + //await CreateStorageContainer(); foreach (string folder in subFolders) { await InitiateAzCopy(folder, cacheLocation); + //await CreateStorageBlobs(folder, cacheLocation); + } + } + + private async Task CreateStorageContainer() + { + if (AuthResult == null) + { + await Authorize(); + } + + if (AuthResult == null) + { + return; + } + + int retryLimit = 3; // ToDo: ConfigurationManager.AppSettings["RetryLimit"].ToString() + int retrySeconds = 30; // ToDo: ConfigurationManager.AppSettings["RetrySeconds"].ToString() + string storageAccountName = "onpremisesdiag435"; // ToDo: ConfigurationManager.AppSettings["StorageAccountName"].ToString() + string storageContainerName = "container"; // ToDo: ConfigurationManager.AppSettings["StorageContainerName"].ToString() + + TokenCredential tokenCredential = new TokenCredential(AuthResult.AccessToken); + StorageCredentials storageCredentials = new StorageCredentials(tokenCredential); + + CloudBlobContainer container = new CloudBlobContainer( + new Uri($"https://{storageAccountName}.blob.core.windows.net/{storageContainerName}"), + storageCredentials); + + DisplayMessage = $"Creating storage container {container.Uri.ToString()}" + Environment.NewLine; + + int createContainerOK = 0; + while (createContainerOK < retryLimit) + { + try + { + container.CreateIfNotExists(); + createContainerOK = retryLimit + 1; + } + catch + { + createContainerOK++; + DisplayMessage += $"...Rety {createContainerOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine; + //System.Threading.Thread.Sleep(retrySeconds * 1000); // ToDo: Need to create timer, this will lock UI. + } + + if (createContainerOK == retryLimit) + { + DisplayMessage += $"Error creating container, check that you have the correct permissions for this storage account." + Environment.NewLine; + } + } + } + + private async Task CreateStorageBlobs(string sourceDirectory, string cacheDirectory) + { + if (AuthResult == null) + { + return; + } + + int retryLimit = 3; // ToDo: ConfigurationManager.AppSettings["RetryLimit"].ToString() + int retrySeconds = 30; // ToDo: ConfigurationManager.AppSettings["RetrySeconds"].ToString() + string storageAccountName = "onpremisesdiag435"; // ToDo: ConfigurationManager.AppSettings["StorageAccountName"].ToString() + string storageContainerName = "container"; // ToDo: ConfigurationManager.AppSettings["StorageContainerName"].ToString() + + TokenCredential tokenCredential = new TokenCredential(AuthResult.AccessToken); + StorageCredentials storageCredentials = new StorageCredentials(tokenCredential); + + string sourceDirName = new DirectoryInfo(sourceDirectory).Name; + + foreach (string dir in Directory.GetDirectories(sourceDirectory)) + { + string dirName = new DirectoryInfo(dir).Name; + DisplayMessage += $"Uploading {dir}" + Environment.NewLine; + + int uploadDirectoryOK = 0; + foreach (string file in Directory.GetFiles(dir)) + { + string fileName = new FileInfo(file).Name; + + CloudBlockBlob blob = new CloudBlockBlob( + new Uri($"https://{storageAccountName}.blob.core.windows.net/{storageContainerName}/{sourceDirName}/{dirName}/{fileName}"), + storageCredentials); + + DisplayMessage += $"Creating storage blob {blob.Uri.ToString()}" + Environment.NewLine; + + int createBlobOK = 0; + while (createBlobOK < retryLimit) + { + try + { + await blob.UploadFromFileAsync(file); + createBlobOK = retryLimit + 1; + File.Delete(file); + } + catch + { + createBlobOK++; + DisplayMessage += $"...Rety {createBlobOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine; + //System.Threading.Thread.Sleep(retrySeconds * 1000); // not sure if this good / bad / ugly. + } + + if (createBlobOK == retryLimit) + { + DisplayMessage += $"Error creating blob, check that you have the correct permissions for this storage account." + Environment.NewLine; + } + } + + if (createBlobOK != retryLimit + 1) + { + uploadDirectoryOK++; + } + + if (uploadDirectoryOK == retryLimit) + { + DisplayMessage += $"Failed upload, too many consecutive errors." + Environment.NewLine; + break; + } + } + + if (Directory.GetFiles(dir).Length == 0) + { + DisplayMessage += "Upload successful."; + Directory.Delete(dir, true); + } + } + + if (Directory.GetDirectories(sourceDirectory).Length == 0) + { + Directory.Delete(sourceDirectory, true); + } + + if (Directory.GetDirectories(cacheDirectory).Length == 0) + { + Directory.Delete(cacheDirectory, true); } - } private async Task InitiateAzCopy(string sourceDir, string parentDir) From 3f861fc8abe87ff0bb5ba43f20ef566bde55615b Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 18:43:38 +1000 Subject: [PATCH 07/10] Finished basic retry logic for upload. --- app/HealthyHabitat/ViewModels/MainWindowViewModel.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs index 8581c32..fc3dc9d 100644 --- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs +++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs @@ -443,8 +443,8 @@ private async Task CreateStorageContainer() catch { createContainerOK++; - DisplayMessage += $"...Rety {createContainerOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine; - //System.Threading.Thread.Sleep(retrySeconds * 1000); // ToDo: Need to create timer, this will lock UI. + DisplayMessage += $"...Retry {createContainerOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine; + await Task.Delay(retrySeconds * 1000); } if (createContainerOK == retryLimit) @@ -499,8 +499,8 @@ private async Task CreateStorageBlobs(string sourceDirectory, string cacheDirect catch { createBlobOK++; - DisplayMessage += $"...Rety {createBlobOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine; - //System.Threading.Thread.Sleep(retrySeconds * 1000); // not sure if this good / bad / ugly. + DisplayMessage += $"...Retry {createBlobOK} of {retryLimit} will start in {retrySeconds} seconds." + Environment.NewLine; + await Task.Delay(retrySeconds * 1000); } if (createBlobOK == retryLimit) From 4f82f74f9e0006d4bdc0017cbb8199aa755072dd Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 18:55:01 +1000 Subject: [PATCH 08/10] Handle 'null' SelectedLocation. --- app/HealthyHabitat/ViewModels/MainWindowViewModel.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs index fc3dc9d..b1483df 100644 --- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs +++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs @@ -233,6 +233,11 @@ public MainWindowViewModel(IDialogService dialogService) UploadClickCommand = new RelayCommand(() => { + if (this.SelectedLocation == null) + { + return; + } + LocationDialogVisible = false; ProgressVisible = true; From 37c0af93e83c7e6839dc6502019e8c56f6c88f0f Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 19:32:56 +1000 Subject: [PATCH 09/10] Moved hardcoded value to appsettings. --- app/HealthyHabitat/App.config | 4 ++++ .../ViewModels/MainWindowViewModel.cs | 20 +++++++++---------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/app/HealthyHabitat/App.config b/app/HealthyHabitat/App.config index 99f37dd..679641c 100644 --- a/app/HealthyHabitat/App.config +++ b/app/HealthyHabitat/App.config @@ -14,9 +14,13 @@ + + + + \ No newline at end of file diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs index b1483df..c81c1a0 100644 --- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs +++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs @@ -196,8 +196,8 @@ public string DisplayMessage } // Auth definitions ------------------------------------------------------------------- - private readonly string ClientId = "18dd432c-1e9e-4da7-93f6-f7d60e3ea712"; // ToDo: ConfigurationManager.AppSettings["ClientID"].ToString() - private readonly string ClientScopes = "user.read https://storage.azure.com/user_impersonation"; // ToDo: ConfigurationManager.AppSettings["ClientScopes"].ToString() + private readonly string ClientId = ConfigurationManager.AppSettings["ApplicationId"].ToString(); + private readonly string ClientScopes = ConfigurationManager.AppSettings["ClientScopes"].ToString(); private IPublicClientApplication PublicClientApp { get; set; } private AuthenticationResult AuthResult { get; set; } @@ -423,10 +423,10 @@ private async Task CreateStorageContainer() return; } - int retryLimit = 3; // ToDo: ConfigurationManager.AppSettings["RetryLimit"].ToString() - int retrySeconds = 30; // ToDo: ConfigurationManager.AppSettings["RetrySeconds"].ToString() - string storageAccountName = "onpremisesdiag435"; // ToDo: ConfigurationManager.AppSettings["StorageAccountName"].ToString() - string storageContainerName = "container"; // ToDo: ConfigurationManager.AppSettings["StorageContainerName"].ToString() + int retryLimit = System.Convert.ToInt32(ConfigurationManager.AppSettings["RetryLimit"].ToString()); + int retrySeconds = System.Convert.ToInt32(ConfigurationManager.AppSettings["RetrySeconds"].ToString()); + string storageAccountName = ConfigurationManager.AppSettings["StorageAccountName"].ToString(); + string storageContainerName = ConfigurationManager.AppSettings["ContainerName"].ToString(); TokenCredential tokenCredential = new TokenCredential(AuthResult.AccessToken); StorageCredentials storageCredentials = new StorageCredentials(tokenCredential); @@ -466,10 +466,10 @@ private async Task CreateStorageBlobs(string sourceDirectory, string cacheDirect return; } - int retryLimit = 3; // ToDo: ConfigurationManager.AppSettings["RetryLimit"].ToString() - int retrySeconds = 30; // ToDo: ConfigurationManager.AppSettings["RetrySeconds"].ToString() - string storageAccountName = "onpremisesdiag435"; // ToDo: ConfigurationManager.AppSettings["StorageAccountName"].ToString() - string storageContainerName = "container"; // ToDo: ConfigurationManager.AppSettings["StorageContainerName"].ToString() + int retryLimit = System.Convert.ToInt32(ConfigurationManager.AppSettings["RetryLimit"].ToString()); + int retrySeconds = System.Convert.ToInt32(ConfigurationManager.AppSettings["RetrySeconds"].ToString()); + string storageAccountName = ConfigurationManager.AppSettings["StorageAccountName"].ToString(); + string storageContainerName = ConfigurationManager.AppSettings["ContainerName"].ToString(); TokenCredential tokenCredential = new TokenCredential(AuthResult.AccessToken); StorageCredentials storageCredentials = new StorageCredentials(tokenCredential); From b8721497b2af3033b38a6470aa021a77beff662c Mon Sep 17 00:00:00 2001 From: "Alex.Gonzalez" <> Date: Wed, 2 Oct 2019 19:35:06 +1000 Subject: [PATCH 10/10] Enabled CreateStorageContainer and CreateStorageBlobs for authenticated uploads. --- app/HealthyHabitat/ViewModels/MainWindowViewModel.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs index c81c1a0..44aa1af 100644 --- a/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs +++ b/app/HealthyHabitat/ViewModels/MainWindowViewModel.cs @@ -403,11 +403,11 @@ private async void CopyFilesToLocalCache(string[] files, string location, string string[] subFolders = Directory.GetDirectories(cacheLocation); - //await CreateStorageContainer(); + await CreateStorageContainer(); foreach (string folder in subFolders) { - await InitiateAzCopy(folder, cacheLocation); - //await CreateStorageBlobs(folder, cacheLocation); + //await InitiateAzCopy(folder, cacheLocation); + await CreateStorageBlobs(folder, cacheLocation); } }