Exemplo n.º 1
0
 /// <summary>
 /// Constructs the token for validating an incoming request.
 /// </summary>
 public HttpSignatureSecurityToken(string rawDigest, string rawSignature)
 {
     RawDigest    = rawDigest;
     RawSignature = rawSignature;
     Digest       = HttpDigest.Parse(rawDigest);
     Signature    = HttpSignature.Parse(rawSignature);
 }
Exemplo n.º 2
0
        private async Task ValidateResponse(HttpRequestMessage request, HttpResponseMessage response)
        {
            if (IgnoreResponseValidation)
            {
                return;
            }
            if (StringExtensions.IsIgnoredPath(IgnoredPaths, request.RequestUri.AbsolutePath, request.Method.Method))
            {
                return;
            }
            if (!response.Headers.TryGetValues(HttpSignature.HTTPHeaderName, out var signatureValues) || signatureValues.Count() == 0)
            {
                return;
            }
            if (!response.Headers.TryGetValues(ResponseSignatureCertificateHeaderName, out var certValues) || certValues.Count() == 0)
            {
                var error = $"Missing certificate in HTTP header '{ResponseSignatureCertificateHeaderName}'. Cannot validate signature.";
                throw new Exception(error);
            }
            var rawSignature   = signatureValues.First();
            var rawCertificate = certValues.First();

            Debug.WriteLine($"{nameof(HttpSignatureDelegatingHandler)}: Raw Signature: {rawSignature}");
            Debug.WriteLine($"{nameof(HttpSignatureDelegatingHandler)}: Raw Certificate: {rawCertificate}");
            X509Certificate2 certificate;

            try {
                certificate = new X509Certificate2(Convert.FromBase64String(rawCertificate));
            } catch (Exception inner) {
                var error = $"Signature Certificate not in a valid format. Expected a base64 encoded x509.";
                throw new Exception(error, inner);
            }
            var validationKey = new X509SecurityKey(certificate);

            Debug.WriteLine($"{nameof(HttpSignatureDelegatingHandler)}: Validation Key: {validationKey.KeyId}");
            var httpSignature = HttpSignature.Parse(rawSignature);

            if (response.Headers.TryGetValues(HttpDigest.HTTPHeaderName, out var digestValues) && digestValues.Count() > 0)
            {
                var rawDigest = digestValues.First();
                Debug.WriteLine($"{nameof(HttpSignatureDelegatingHandler)}: Raw Digest: {rawDigest}");
                var httpDigest = HttpDigest.Parse(rawDigest);
                Debug.WriteLine($"{nameof(HttpSignatureDelegatingHandler)}: Validated Token Digest: {httpDigest}");
                var responseBody = await response.Content.ReadAsByteArrayAsync();

                // Validate the request.
                var disgestIsValid = httpDigest.Validate(responseBody);
                if (!disgestIsValid)
                {
                    var error = $"Response digest validation failed.";
                    throw new Exception(error);
                }
            }
            response.Headers.TryGetValues(ResponseCreatedHeaderName, out var createdFieldValue);
            var signatureIsValid = httpSignature.Validate(validationKey, request.RequestUri, request.Method.Method, createdFieldValue.First(), response.Headers);

            if (!signatureIsValid)
            {
                var error = $"Response signature validation failed.";
                throw new Exception(error);
            }
        }