From f5ecf8734b49bcb4f0e90e2180e22c350cd10238 Mon Sep 17 00:00:00 2001 From: Eric Winkler Date: Fri, 20 Apr 2018 03:26:50 +0800 Subject: [PATCH] Support custom\external ServiceClientCredentials (#195) * Avoid liskov substitution violation by guaranteeing only AzureCredentials are available from the RestClient Additionally, facilitate consumers supplying their own ServiceClientCredentials via a new constructor on AzureCredentials. * Removing redundant typecasts --- src/ResourceManagement/Compute/ComputeManager.cs | 2 +- .../Graph.RBAC/CertificateCredentialImpl.cs | 2 +- src/ResourceManagement/Graph.RBAC/GraphRBACManager.cs | 2 +- .../Graph.RBAC/PasswordCredentialImpl.cs | 2 +- src/ResourceManagement/Msi/MsiManager.cs | 2 +- .../ResourceManager/Authentication/AzureCredentials.cs | 6 ++++++ .../ResourceManager/Core/RestClient/RestClient.cs | 9 +++++---- 7 files changed, 16 insertions(+), 9 deletions(-) diff --git a/src/ResourceManagement/Compute/ComputeManager.cs b/src/ResourceManagement/Compute/ComputeManager.cs index 3ea5b924ad3..ca73cda9200 100644 --- a/src/ResourceManagement/Compute/ComputeManager.cs +++ b/src/ResourceManagement/Compute/ComputeManager.cs @@ -43,7 +43,7 @@ public ComputeManager(RestClient restClient, string subscriptionId) : { storageManager = StorageManager.Authenticate(restClient, subscriptionId); networkManager = NetworkManager.Authenticate(restClient, subscriptionId); - rbacManager = GraphRbacManager.Authenticate(restClient, ((AzureCredentials)(restClient.Credentials)).TenantId); + rbacManager = GraphRbacManager.Authenticate(restClient, restClient.Credentials.TenantId); } #endregion diff --git a/src/ResourceManagement/Graph.RBAC/CertificateCredentialImpl.cs b/src/ResourceManagement/Graph.RBAC/CertificateCredentialImpl.cs index 639d046d61a..ea8e8ce0727 100644 --- a/src/ResourceManagement/Graph.RBAC/CertificateCredentialImpl.cs +++ b/src/ResourceManagement/Graph.RBAC/CertificateCredentialImpl.cs @@ -74,7 +74,7 @@ public CertificateCredentialImpl WithDuration(TimeSpan duration) AzureEnvironment environment = null; if (restClient.Credentials is AzureCredentials) { - environment = ((AzureCredentials)restClient.Credentials).Environment; + environment = restClient.Credentials.Environment; } else { diff --git a/src/ResourceManagement/Graph.RBAC/GraphRBACManager.cs b/src/ResourceManagement/Graph.RBAC/GraphRBACManager.cs index cdd7f161cd4..7e530525759 100644 --- a/src/ResourceManagement/Graph.RBAC/GraphRBACManager.cs +++ b/src/ResourceManagement/Graph.RBAC/GraphRBACManager.cs @@ -34,7 +34,7 @@ public GraphRbacManager(RestClient restClient, string tenantId) string graphEndpoint = AzureEnvironment.AzureGlobalCloud.GraphEndpoint; if (restClient.Credentials is AzureCredentials) { - graphEndpoint = ((AzureCredentials)restClient.Credentials).Environment.GraphEndpoint; + graphEndpoint = restClient.Credentials.Environment.GraphEndpoint; } inner = new GraphRbacManagementClient(new Uri(graphEndpoint), restClient.Credentials, diff --git a/src/ResourceManagement/Graph.RBAC/PasswordCredentialImpl.cs b/src/ResourceManagement/Graph.RBAC/PasswordCredentialImpl.cs index c4cdb49eb4b..3cf175a9221 100644 --- a/src/ResourceManagement/Graph.RBAC/PasswordCredentialImpl.cs +++ b/src/ResourceManagement/Graph.RBAC/PasswordCredentialImpl.cs @@ -61,7 +61,7 @@ public PasswordCredentialImpl WithDuration(TimeSpan duration) AzureEnvironment environment = null; if (restClient.Credentials is AzureCredentials) { - environment = ((AzureCredentials)restClient.Credentials).Environment; + environment = restClient.Credentials.Environment; } else { diff --git a/src/ResourceManagement/Msi/MsiManager.cs b/src/ResourceManagement/Msi/MsiManager.cs index 25bbe2aff33..31f1baaaadf 100644 --- a/src/ResourceManagement/Msi/MsiManager.cs +++ b/src/ResourceManagement/Msi/MsiManager.cs @@ -22,7 +22,7 @@ private MsiManager(RestClient restClient, string subscriptionId) : SubscriptionId = subscriptionId }) { - this.graphRbacManager = Microsoft.Azure.Management.Graph.RBAC.Fluent.GraphRbacManager.Authenticate(restClient, ((AzureCredentials)(restClient.Credentials)).TenantId); + this.graphRbacManager = Microsoft.Azure.Management.Graph.RBAC.Fluent.GraphRbacManager.Authenticate(restClient, restClient.Credentials.TenantId); } #region MsiManager builder diff --git a/src/ResourceManagement/ResourceManager/Authentication/AzureCredentials.cs b/src/ResourceManagement/ResourceManager/Authentication/AzureCredentials.cs index 4289aac0f23..ca3a5699a80 100644 --- a/src/ResourceManagement/ResourceManager/Authentication/AzureCredentials.cs +++ b/src/ResourceManagement/ResourceManager/Authentication/AzureCredentials.cs @@ -64,6 +64,12 @@ public AzureCredentials(MSILoginInformation msiLoginInformation, AzureEnvironmen this.msiTokenProviderFactory = new MSITokenProviderFactory(msiLoginInformation); } + public AzureCredentials(ServiceClientCredentials credentials, string tenantId, AzureEnvironment environment) + : this(tenantId, environment) + { + credentialsCache[new Uri(Environment.ManagementEndpoint)] = credentials; + } + private AzureCredentials(string tenantId, AzureEnvironment environment) { TenantId = tenantId; diff --git a/src/ResourceManagement/ResourceManager/Core/RestClient/RestClient.cs b/src/ResourceManagement/ResourceManager/Core/RestClient/RestClient.cs index caebd1d3379..c04886607dd 100644 --- a/src/ResourceManagement/ResourceManager/Core/RestClient/RestClient.cs +++ b/src/ResourceManagement/ResourceManager/Core/RestClient/RestClient.cs @@ -11,6 +11,7 @@ using System.Net.NetworkInformation; using System.Security.Cryptography; using System.Text; +using Microsoft.Azure.Management.ResourceManager.Fluent.Authentication; namespace Microsoft.Azure.Management.ResourceManager.Fluent.Core { @@ -37,7 +38,7 @@ public string BaseUri get; private set; } - public ServiceClientCredentials Credentials + public AzureCredentials Credentials { get; private set; } @@ -77,7 +78,7 @@ public static RestClientBuilder.IBlank Configure() public class RestClientBuilder : RestClientBuilder.IBlank, RestClientBuilder.IBuildable { private string baseUri; - private ServiceClientCredentials credentials; + private AzureCredentials credentials; private List handlers; private RetryPolicy retryPolicy; private HttpLoggingDelegatingHandler loggingDelegatingHandler; @@ -155,7 +156,7 @@ public interface IBuildable : IWithEnvironment, IWithBaseUri IBuildable WithLogLevel(HttpLoggingDelegatingHandler.Level level); - IBuildable WithCredentials(ServiceClientCredentials credentials); + IBuildable WithCredentials(AzureCredentials credentials); RestClient Build(); } @@ -214,7 +215,7 @@ public IBuildable WithLogLevel(HttpLoggingDelegatingHandler.Level level) return this; } - public IBuildable WithCredentials(ServiceClientCredentials credentials) + public IBuildable WithCredentials(AzureCredentials credentials) { this.credentials = credentials; return this;