Exemple #1
0
        protected override async Task <HttpResponseMessage> SendAsync(
            HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            if (Logging.IsEnabled)
            {
                Logging.Enter(this, $"{request.RequestUri}", nameof(SendAsync));
            }

            HttpResponseMessage response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);

            if (response.StatusCode == HttpStatusCode.Unauthorized)
            {
#if NET5_0_OR_GREATER
                if (request.Options.TryGetValue(new HttpRequestOptionsKey <object>(ProvisioningHeaderName), out object result))
#else
                if (request.Properties.TryGetValue(ProvisioningHeaderName, out object result))
#endif
                {
                    if (result is Action <string> setSasToken)
                    {
                        string target          = GetTarget(request.RequestUri.LocalPath);
                        string responseContent = await response.Content.ReadHttpContentAsStringAsync(cancellationToken).ConfigureAwait(false);

                        TpmChallenge challenge = JsonConvert.DeserializeObject <TpmChallenge>(responseContent);

                        string sasToken = ProvisioningSasBuilder.ExtractServiceAuthKey(
                            _securityProvider,
                            target,
                            Convert.FromBase64String(challenge.AuthenticationKey));

                        setSasToken(sasToken);

                        if (Logging.IsEnabled)
                        {
                            Logging.Info(this, $"Authorization challenge. Retrying with Token:{sasToken}");
                        }

                        response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);
                    }
                }
            }

            if (Logging.IsEnabled)
            {
                Logging.Exit(this, $"{request.RequestUri}", nameof(SendAsync));
            }

            return(response);
        }
        private void SendLastResponse()
        {
            string sas = ProvisioningSasBuilder.ExtractServiceAuthKey(
                _security,
                _hostName,
                _nonceBuffer);

            byte[] responseBuffer = new byte[sas.Length + 1];
            responseBuffer[0] = 0x0;
            Buffer.BlockCopy(Encoding.UTF8.GetBytes(sas), 0, responseBuffer, 1, sas.Length);

            var response = new SaslResponse {
                Response = new ArraySegment <byte>(responseBuffer)
            };

            Negotiator.WriteFrame(response, true);
        }