Exemple #1
0
        public async virtual Task <ExtendedAccessToken> AuthenticateAsync(string[] scopes, CancellationToken cancellationToken)
        {
            MsiType msiType = await GetMsiTypeAsync(cancellationToken).ConfigureAwait(false);

            // if msi is unavailable or we were unable to determine the type return CredentialUnavailable exception that no endpoint was found
            if (msiType == MsiType.Unavailable || msiType == MsiType.Unknown)
            {
                return(new ExtendedAccessToken(new CredentialUnavailableException(MsiUnavailableError)));
            }

            using Request request = CreateAuthRequest(msiType, scopes);

            Response response = await _pipeline.HttpPipeline.SendRequestAsync(request, cancellationToken).ConfigureAwait(false);

            if (response.Status == 200)
            {
                AccessToken result = await DeserializeAsync(response.ContentStream, cancellationToken).ConfigureAwait(false);

                return(new ExtendedAccessToken(result));
            }

            if (response.Status == 400 && msiType == MsiType.Imds)
            {
                _msiType = MsiType.Unavailable;

                string message = await ResponseExceptionExtensions.CreateRequestFailedMessageAsync(IdentityUnavailableError, response, null, true).ConfigureAwait(false);

                return(new ExtendedAccessToken(new CredentialUnavailableException(message)));
            }

            throw await response.CreateRequestFailedExceptionAsync().ConfigureAwait(false);
        }
Exemple #2
0
        public virtual ExtendedAccessToken Authenticate(string[] scopes, CancellationToken cancellationToken)
        {
            MsiType msiType = GetMsiType(cancellationToken);

            // if msi is unavailable or we were unable to determine the type return CredentialUnavailable exception that no endpoint was found
            if (msiType == MsiType.Unavailable || msiType == MsiType.Unknown)
            {
                return(new ExtendedAccessToken(new CredentialUnavailableException(MsiUnavailableError)));
            }

            using Request request = CreateAuthRequest(msiType, scopes);

            Response response = _pipeline.HttpPipeline.SendRequest(request, cancellationToken);

            if (response.Status == 200)
            {
                AccessToken result = Deserialize(response.ContentStream);

                return(new ExtendedAccessToken(result));
            }

            if (response.Status == 400 && msiType == MsiType.Imds)
            {
                _msiType = MsiType.Unavailable;

                ValueTask <string> messageTask = ResponseExceptionExtensions.CreateRequestFailedMessageAsync(IdentityUnavailableError, response, null, false);

                // TODO: this should use TaskExtensions EnsureCompleted from Azure.Core shared source when it gets move into shared source.
                Debug.Assert(messageTask.IsCompleted);

                string message = messageTask.GetAwaiter().GetResult();

                return(new ExtendedAccessToken(new CredentialUnavailableException(message)));
            }

            throw response.CreateRequestFailedException();
        }