public override void ProcessRequest(ref System.ServiceModel.Channels.RequestContext requestContext)
        {
            var request = requestContext.RequestMessage;

            if (endpointFilter == null || endpointFilter(request))
            {
                IPrincipal principal = ExtractCredentials(request);
                if (principal != null)
                {
                    InitializeSecurityContext(request, principal);
                }
                else
                {
                    var reply = Message.CreateMessage(MessageVersion.None, null);
                    var responseProperty = new HttpResponseMessageProperty() { StatusCode = HttpStatusCode.Unauthorized };

                    if (sendChallenge)
                    {
                        var ts = Hawk.ConvertToUnixTimestamp(DateTime.Now).ToString();
                        var challenge = string.Format("ts=\"{0}\" ntp=\"{1}\"",
                            ts, "pool.ntp.org");

                        responseProperty.Headers.Add("WWW-Authenticate", challenge);
                    }

                    reply.Properties[HttpResponseMessageProperty.Name] = responseProperty;
                    requestContext.Reply(reply);

                    requestContext = null;
                }
            }
        }
        public override void ProcessRequest(ref System.ServiceModel.Channels.RequestContext requestContext)
        {
            if (Trace.CorrelationManager.ActivityId == Guid.Empty)
                Trace.CorrelationManager.ActivityId = Guid.NewGuid();

            var request = requestContext.RequestMessage;
            
            if (endpointFilter == null || endpointFilter(request))
            {
                try
                {
                    IPrincipal principal = ExtractCredentials(request);
                    if (principal != null)
                    {
                        InitializeSecurityContext(request, principal);
                    }
                    else
                    {
                        var reply = Message.CreateMessage(MessageVersion.None, null);
                        var responseProperty = new HttpResponseMessageProperty() { StatusCode = HttpStatusCode.Unauthorized };

                        if (sendChallenge)
                        {
                            var ts = Hawk.ConvertToUnixTimestamp(DateTime.Now).ToString();
                            var challenge = string.Format("ts=\"{0}\" ntp=\"{1}\"",
                                ts, "pool.ntp.org");

                            responseProperty.Headers.Add("WWW-Authenticate", challenge);
                        }

                        reply.Properties[HttpResponseMessageProperty.Name] = responseProperty;
                        requestContext.Reply(reply);

                        requestContext = null;
                    }
                }
                catch (SecurityException ex)
                {
                    TraceSource.TraceData(TraceEventType.Error, 0,
                        string.Format("{0} - Security Exception {1}",
                            Trace.CorrelationManager.ActivityId, ex.ToString()));

                    var reply = Message.CreateMessage(MessageVersion.None, null, (object)ex.Message);
                    var responseProperty = new HttpResponseMessageProperty() { StatusCode = HttpStatusCode.Unauthorized };

                    reply.Properties[HttpResponseMessageProperty.Name] = responseProperty;
                    requestContext.Reply(reply);

                    requestContext = null;
                }
            }
        }