aliyun-net-credentials/Provider/DefaultCredentialsProvider.cs (135 lines of code) (raw):

using System; using System.Collections.Generic; using System.Threading.Tasks; using Aliyun.Credentials.Exceptions; using Aliyun.Credentials.Models; using Aliyun.Credentials.Utils; namespace Aliyun.Credentials.Provider { /// <summary> /// The default credential provider chain of the Credentials tool allows you to use the same code to obtain credentials for different environments based on configurations independent of the application. /// </summary> /// <remarks> If you use <c>Client client = new Client()</c> to initialize a Credentials client without specifying an initialization method, the Credentials tool obtains the credential information in the following order: /// <list type="number"> /// <item><description>Obtain the credential information from environment variables</description></item> /// <item><description>Obtain the credential information by using the RAM role of an OIDC IdP</description></item> /// <item><description>Obtain the credential information from config.json</description></item> /// <item><description>Obtain the credential information by using the RAM role of an ECS instance</description></item> /// <item><description>Obtain the credential information by URI</description></item> /// </list> /// </remarks> public class DefaultCredentialsProvider : IAlibabaCloudCredentialsProvider { private readonly List<IAlibabaCloudCredentialsProvider> UserConfigurationProviders = new List<IAlibabaCloudCredentialsProvider>(); private volatile IAlibabaCloudCredentialsProvider lastUsedCredentialsProvider; private readonly bool reuseLastProviderEnabled; public DefaultCredentialsProvider() { this.reuseLastProviderEnabled = true; CreateDefaultChain(); } public DefaultCredentialsProvider(bool reuseLastProviderEnabled) { this.reuseLastProviderEnabled = reuseLastProviderEnabled; CreateDefaultChain(); } private void CreateDefaultChain() { UserConfigurationProviders.Add(new EnvironmentVariableCredentialsProvider()); if (AuthUtils.EnvironmentEnableOIDC()) { UserConfigurationProviders.Add(new OIDCRoleArnCredentialProvider.Builder() .RoleArn(AuthUtils.EnvironmentRoleArn) .OIDCProviderArn(AuthUtils.EnvironmentOIDCProviderArn) .OIDCTokenFilePath(AuthUtils.EnvironmentOIDCTokenFilePath) .Build()); } UserConfigurationProviders.Add(new CLIProfileCredentialsProvider()); UserConfigurationProviders.Add(new ProfileCredentialsProvider()); var roleName = AuthUtils.EnvironmentEcsMetaData; var metadataDisabled = AuthUtils.EnvironmentEcsMetaDataDisabled ?? ""; if (metadataDisabled.ToLower() != "true") { UserConfigurationProviders.Add(new EcsRamRoleCredentialProvider.Builder().RoleName(roleName).Build()); } string uri = AuthUtils.EnvironmentCredentialsURI; if (!string.IsNullOrEmpty(uri)) { UserConfigurationProviders.Add(new URLCredentialProvider.Builder().CredentialsURI(uri).Build()); } } public CredentialModel GetCredentials() { if (this.reuseLastProviderEnabled && this.lastUsedCredentialsProvider != null) { return this.lastUsedCredentialsProvider.GetCredentials(); } CredentialModel credential; List<string> errorMessages = new List<string>(); foreach (IAlibabaCloudCredentialsProvider provider in UserConfigurationProviders) { try { credential = provider.GetCredentials(); this.lastUsedCredentialsProvider = provider; if (credential != null) { return new CredentialModel { AccessKeyId = credential.AccessKeyId, AccessKeySecret = credential.AccessKeySecret, SecurityToken = credential.SecurityToken, ProviderName = string.Format("{0}/{1}", this.GetProviderName(), credential.ProviderName) }; } } catch (Exception e) { errorMessages.Add(provider.GetType().Name + ": " + e.Message); } } throw new CredentialException("not found credentials: [" + string.Join(", ", errorMessages) + "]"); } public async Task<CredentialModel> GetCredentialsAsync() { if (this.reuseLastProviderEnabled && this.lastUsedCredentialsProvider != null) { return await this.lastUsedCredentialsProvider.GetCredentialsAsync(); } CredentialModel credential; List<string> errorMessages = new List<string>(); foreach (IAlibabaCloudCredentialsProvider provider in UserConfigurationProviders) { try { credential = await provider.GetCredentialsAsync(); this.lastUsedCredentialsProvider = provider; if (credential != null) { return new CredentialModel { AccessKeyId = credential.AccessKeyId, AccessKeySecret = credential.AccessKeySecret, SecurityToken = credential.SecurityToken, ProviderName = string.Format("{0}/{1}", this.GetProviderName(), credential.ProviderName) }; } } catch (Exception e) { errorMessages.Add(provider.GetType().Name + ": " + e.Message); } } throw new CredentialException("not found credentials: [" + string.Join(", ", errorMessages) + "]"); } public void AddCredentialsProvider(IAlibabaCloudCredentialsProvider provider) { UserConfigurationProviders.Insert(0, provider); } public void RemoveCredentialsProvider(IAlibabaCloudCredentialsProvider provider) { UserConfigurationProviders.Remove(provider); } public bool ContainsCredentialsProvider(IAlibabaCloudCredentialsProvider provider) { return UserConfigurationProviders.Contains(provider); } public void ClearCredentialsProvider() { UserConfigurationProviders.Clear(); } public string GetProviderName() { return "default"; } } }