< Summary

Class:Azure.Identity.EnvironmentCredential
Assembly:Azure.Identity
File(s):C:\Git\azure-sdk-for-net\sdk\identity\Azure.Identity\src\EnvironmentCredential.cs
Covered lines:32
Uncovered lines:6
Coverable lines:38
Total lines:146
Line coverage:84.2% (32 of 38)
Covered branches:14
Total branches:16
Branch coverage:87.5% (14 of 16)

Metrics

MethodCyclomatic complexity Line coverage Branch coverage
get_Credential()-100%100%
.ctor()-100%100%
.ctor(...)-0%100%
.ctor(...)-93.75%83.33%
.ctor(...)-100%100%
GetToken(...)-100%100%
GetTokenAsync()-50%100%
GetTokenImplAsync()-80%100%

File(s)

C:\Git\azure-sdk-for-net\sdk\identity\Azure.Identity\src\EnvironmentCredential.cs

#LineLine coverage
 1// Copyright (c) Microsoft Corporation. All rights reserved.
 2// Licensed under the MIT License.
 3
 4using Azure.Core;
 5using System;
 6using System.Text;
 7using System.Threading;
 8using System.Threading.Tasks;
 9using Azure.Core.Pipeline;
 10
 11namespace Azure.Identity
 12{
 13    /// <summary>
 14    /// Enables authentication to Azure Active Directory using client secret, or username and password,
 15    /// details configured in the following environment variables:
 16    /// <list type="table">
 17    /// <listheader><term>Variable</term><description>Description</description></listheader>
 18    /// <item><term>AZURE_TENANT_ID</term><description>The Azure Active Directory tenant(directory) ID.</description></i
 19    /// <item><term>AZURE_CLIENT_ID</term><description>The client(application) ID of an App Registration in the tenant.<
 20    /// <item><term>AZURE_CLIENT_SECRET</term><description>A client secret that was generated for the App Registration.<
 21    /// <item><term>AZURE_CLIENT_CERTIFICATE_LOCATION</term><description>A path to the certificate that was generate for
 22    /// <item><term>AZURE_USERNAME</term><description>The username, also known as upn, of an Azure Active Directory user
 23    /// <item><term>AZURE_PASSWORD</term><description>The password of the Azure Active Directory user account. Note this
 24    /// </list>
 25    /// This credential ultimately uses a <see cref="ClientSecretCredential"/> or <see cref="UsernamePasswordCredential"
 26    /// perform the authentication using these details. Please consult the
 27    /// documentation of that class for more details.
 28    /// </summary>
 29    public class EnvironmentCredential : TokenCredential
 30    {
 31        private const string UnavailbleErrorMessage = "EnvironmentCredential authentication unavailable. Environment var
 32        private readonly CredentialPipeline _pipeline;
 33
 2034        internal TokenCredential Credential { get; }
 35
 36        /// <summary>
 37        /// Creates an instance of the EnvironmentCredential class and reads client secret details from environment vari
 38        /// If the expected environment variables are not found at this time, the GetToken method will return the defaul
 39        /// </summary>
 40        public EnvironmentCredential()
 1641            : this(CredentialPipeline.GetInstance(null))
 42        {
 1643        }
 44
 45        /// <summary>
 46        /// Creates an instance of the EnvironmentCredential class and reads client secret details from environment vari
 47        /// If the expected environment variables are not found at this time, the GetToken method will return the defaul
 48        /// </summary>
 49        /// <param name="options">Options that allow to configure the management of the requests sent to the Azure Activ
 50        public EnvironmentCredential(TokenCredentialOptions options)
 051            : this(CredentialPipeline.GetInstance(options))
 52        {
 053        }
 54
 55
 2256        internal EnvironmentCredential(CredentialPipeline pipeline)
 57        {
 2258            _pipeline = pipeline;
 59
 2260            string tenantId = EnvironmentVariables.TenantId;
 2261            string clientId = EnvironmentVariables.ClientId;
 2262            string clientSecret = EnvironmentVariables.ClientSecret;
 2263            string clientCertificatePath = EnvironmentVariables.ClientCertificatePath;
 2264            string username = EnvironmentVariables.Username;
 2265            string password = EnvironmentVariables.Password;
 66
 2267            if (tenantId != null && clientId != null)
 68            {
 869                if (clientSecret != null)
 70                {
 471                    Credential = new ClientSecretCredential(tenantId, clientId, clientSecret, null, _pipeline, null);
 72                }
 473                else if (username != null && password != null)
 74                {
 075                    Credential = new UsernamePasswordCredential(username, password, tenantId, clientId, null, _pipeline,
 76                }
 477                else if (clientCertificatePath != null)
 78                {
 479                    Credential = new ClientCertificateCredential(tenantId, clientId, clientCertificatePath, null, _pipel
 80                }
 81            }
 82
 1883        }
 84
 885        internal EnvironmentCredential(CredentialPipeline pipeline, TokenCredential credential)
 86        {
 887            _pipeline = pipeline;
 888            Credential = credential;
 889        }
 90
 91        /// <summary>
 92        /// Obtains a token from the Azure Active Directory service, using the specified client details specified in the
 93        /// AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET or AZURE_USERNAME and AZURE_PASSWORD to authentica
 94        /// This method is called by Azure SDK clients. It isn't intended for use in application code.
 95        /// </summary>
 96        /// <remarks>
 97        /// If the environment variables AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET are not specified, th
 98        /// </remarks>
 99        /// <param name="requestContext">The details of the authentication request.</param>
 100        /// <param name="cancellationToken">A <see cref="CancellationToken"/> controlling the request lifetime.</param>
 101        /// <returns>An <see cref="AccessToken"/> which can be used to authenticate service client calls.</returns>
 102        public override AccessToken GetToken(TokenRequestContext requestContext, CancellationToken cancellationToken = d
 103        {
 4104            return GetTokenImplAsync(false, requestContext, cancellationToken).EnsureCompleted();
 105        }
 106
 107        /// <summary>
 108        /// Obtains a token from the Azure Active Directory service, using the specified client details specified in the
 109        /// AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET or AZURE_USERNAME and AZURE_PASSWORD to authentica
 110        /// This method is called by Azure SDK clients. It isn't intended for use in application code.
 111        /// </summary>
 112        /// <remarks>
 113        /// If the environment variables AZURE_TENANT_ID, AZURE_CLIENT_ID, and AZURE_CLIENT_SECRET are not specifeid, th
 114        /// </remarks>
 115        /// <param name="requestContext">The details of the authentication request.</param>
 116        /// <param name="cancellationToken">A <see cref="CancellationToken"/> controlling the request lifetime.</param>
 117        /// <returns>An <see cref="AccessToken"/> which can be used to authenticate service client calls, or a default <
 118        public override async ValueTask<AccessToken> GetTokenAsync(TokenRequestContext requestContext, CancellationToken
 119        {
 4120            return await GetTokenImplAsync(true, requestContext, cancellationToken).ConfigureAwait(false);
 0121        }
 122
 123        private async ValueTask<AccessToken> GetTokenImplAsync(bool async, TokenRequestContext requestContext, Cancellat
 124        {
 8125            using CredentialDiagnosticScope scope = _pipeline.StartGetTokenScope("EnvironmentCredential.GetToken", reque
 126
 8127            if (Credential is null)
 128            {
 4129                throw scope.FailWrapAndThrow(new CredentialUnavailableException(UnavailbleErrorMessage));
 130            }
 131
 132            try
 133            {
 4134                AccessToken token = async
 4135                    ? await Credential.GetTokenAsync(requestContext, cancellationToken).ConfigureAwait(false)
 4136                    : Credential.GetToken(requestContext, cancellationToken);
 137
 0138                return scope.Succeeded(token);
 139            }
 4140            catch (Exception e)
 141            {
 4142                 throw scope.FailWrapAndThrow(e);
 143            }
 0144        }
 145    }
 146}