protected virtual bool VerifySignature(HttpContext context, SignatureValidationOptions validationOptions, out RequestSignature signature, out string reason)
        {
            var services = context.RequestServices;
            var options  = services.GetRequiredService <TransportSecuritySettings>();

            signature = context.Request.GetSignature();
            reason    = string.Empty;

            if (signature == null)
            {
                reason = "Request signature not present";
                return(!options.SignatureRequred);
            }

            if (validationOptions.VerifyRequest && !signature.IsValid)
            {
                reason = "Request signature not valid";
                return(false);
            }

            if (validationOptions.VerifyCertificate &&
                !VerifyCertificate(signature.Token, signature.Certificate, out reason))
            {
                return(false);
            }

            return(true);
        }
        public virtual Task OnAuthorizationAsync(AuthorizationFilterContext context)
        {
            var services = context.HttpContext.RequestServices;
            var logger   = services.GetRequiredService <ILogger <SignatureFilterAttribute> >();

            var options = new SignatureValidationOptions
            {
                VerifyRequest = true
            };

            if (!VerifySignature(context.HttpContext, options, out var signature, out var reason))
            {
                logger.LogWarning(reason);

                context.Result = new StatusCodeResult(461);
            }

            return(Task.CompletedTask);
        }