public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
        {
            ArraySegment<byte> messageBuffer;
            byte[] writeBuffer = null;

            int messageLength;
            using (MemoryStream stream = new MemoryStream())
            {
                using (XmlWriter writer = XmlWriter.Create(stream, _writerSettings))
                {
                    message.WriteMessage(writer);
                }

                // TryGetBuffer is the preferred path but requires 4.6
                //stream.TryGetBuffer(out messageBuffer);
                writeBuffer = stream.ToArray();
                messageBuffer = new ArraySegment<byte>(writeBuffer);

                messageLength = (int)stream.Position;
            }

            int totalLength = messageLength + messageOffset;
            byte[] totalBytes = bufferManager.TakeBuffer(totalLength);
            Array.Copy(messageBuffer.Array, 0, totalBytes, messageOffset, messageLength);

            ArraySegment<byte> byteArray = new ArraySegment<byte>(totalBytes, messageOffset, messageLength);
            return byteArray;
        }
        public override bool CheckAccess(OperationContext operationContext, ref Message message)
        {
           var contractName = operationContext.EndpointDispatcher.ContractName; 
           if (contractName == "IMetadataExchange" || contractName == "IHttpGetHelpPageAndMetadataContract") 
           { 
               // support for MEX 
               return true; 
            }
             
            var digestState = new DigestAuthenticationState(operationContext, GetRealm(ref message));
            if (!digestState.IsRequestDigestAuth)
            {
                return UnauthorizedResponse(digestState);
            }

            string password;
            if (!GetPassword(ref message, digestState.Username, out password))
            {
                return UnauthorizedResponse(digestState);
            }

            digestState.Password = password;
            if (!digestState.Authorized || digestState.IsNonceStale)
            {
                return UnauthorizedResponse(digestState);
            }

            return Authorized(digestState, operationContext, ref message);
        }
 public override void WriteMessage(Message message, Stream stream)
 {
     using (XmlWriter writer = XmlWriter.Create(stream, _writerSettings))
     {
         message.WriteMessage(writer);
     }
 }
            public override string GetRealm(ref Message message)
            {
                if (!message.Properties.ContainsKey(HttpRequestMessageProperty.Name))
                {
                    return base.GetRealm(ref message);
                }

                var requestProperty = (HttpRequestMessageProperty)message.Properties[HttpRequestMessageProperty.Name];
                return requestProperty.Headers.Get(DigestRealmHeaderName);
            }
 public override void OnReceive(ref Message msg)
 {
     // Verify the additional Header inserted by the ChannelMessageInterceptor exists
     if (msg.Headers.FindHeader("ByPass", "urn:InterceptorNamespace") > 0)
     {
         return;
     }
     // Drop incoming Message if the Message does not have the special header
     msg = null;
 }
 private void LogIncomingRequest(OperationContext operationContext, ref Message message, bool authenticated)
 {
     try
     {
         if (_logCallback != null)
         {
             _logCallback(operationContext, ref message, authenticated);
         }
     }
     catch { /* Swallow any exceptions */ }
 }
示例#7
0
文件: WcfService.cs 项目: KKhurin/wcf
        public Message MessageRequestReply(Message message)
        {
            var reader = message.GetReaderAtBodyContents();

            Message requestmessage = Message.CreateMessage(
                message.Version,
                "http://tempuri.org/IWcfService/MessageRequestReplyResponse",
                reader.ReadString() + "[service] Request received, this is my Reply.");

            return requestmessage;
        }
 public override void OnReceive(ref Message msg)
 {
     if (msg.Headers.FindHeader("ByPass", "urn:InterceptorNamespace") > 0)
     {
         if (++_messagesSinceLastReport == _reportPeriod)
         {
             Console.WriteLine(_reportPeriod + " wind speed reports have been received.");
         }
         return;
     }
     // Drop incoming Message if the Message does not have the special header
     msg = null;
 }
        private bool Authorized(DigestAuthenticationState digestState, OperationContext operationContext, ref Message message)
        {
            object identitiesListObject;
            if (!operationContext.ServiceSecurityContext.AuthorizationContext.Properties.TryGetValue("Identities",
                out identitiesListObject))
            {
                identitiesListObject = new List<IIdentity>(1);
                operationContext.ServiceSecurityContext.AuthorizationContext.Properties.Add("Identities", identitiesListObject);
            }

            var identities = identitiesListObject as IList<IIdentity>;
            identities.Add(new GenericIdentity(digestState.Username, "GenericPrincipal"));

            return true;
        }
示例#10
0
            public override bool GetPassword(ref Message message, string username, out string password)
            {
                if (!message.Properties.ContainsKey(HttpRequestMessageProperty.Name))
                {
                    password = null;
                    return false;
                }

                var requestProperty = (HttpRequestMessageProperty) message.Properties[HttpRequestMessageProperty.Name];
                string sentUsername = requestProperty.Headers.Get(DigestUsernameHeaderName);
                if (username.Equals(sentUsername))
                {
                    password = requestProperty.Headers.Get(DigestPasswordHeaderName);
                    return true;
                }

                password = null;
                return false;
            }
        public static void SimpleConsoleLogger(OperationContext operationContext, ref Message message, bool authenticated)
        {
            var log = new StringBuilder();
            log.Append("Via:");
            object requestMessagePropertyObject;
            if (operationContext.IncomingMessageProperties.TryGetValue(HttpRequestMessageProperty.Name,
                out requestMessagePropertyObject))
            {
                var requestMessageProperty = requestMessagePropertyObject as HttpRequestMessageProperty;
                if (requestMessageProperty != null)
                {
                    log.Append(requestMessageProperty.Method).Append(' ');
                }
            }

            log.AppendLine(message.Properties.Via.ToString());
            log.Append("To Header:").AppendLine(message.Headers.Action);
            log.Append("Authentication ").AppendLine(authenticated ? "succeeded" : "failed");
            Console.WriteLine(log.ToString());
        }
        public override bool CheckAccess(OperationContext operationContext, ref Message message)
        {
            var digestState = new DigestAuthenticationState(operationContext, GetRealm(ref message));
            if (!digestState.IsRequestDigestAuth)
            {
                return UnauthorizedResponse(digestState);
            }

            string password;
            if (!GetPassword(ref message, digestState.Username, out password))
            {
                return UnauthorizedResponse(digestState);
            }

            digestState.Password = password;
            if (!digestState.Authorized || digestState.IsNonceStale)
            {
                return UnauthorizedResponse(digestState);
            }

            return Authorized(digestState, operationContext, ref message);
        }
        public override bool CheckAccess(OperationContext operationContext, ref Message message)
        {
            var basicState = new BasicAuthenticationState(operationContext, GetRealm(ref message));
            if (!basicState.IsRequestBasicAuth)
            {
                return UnauthorizedResponse(basicState);
            }

            string password;
            if (!GetPassword(ref message, basicState.Username, out password))
            {
                return UnauthorizedResponse(basicState);
            }

            if(basicState.Password != password)
            {
                // According to RFC2616, a forbidden response should be in response to valid credentials where the
                // authenticated user is not allowed to use the site but WCF responds with Forbbiden with an incorrect
                // password. We should be returning Unauthorized, but this matches WCF behavior.
                return ForbiddenResponse(basicState);
            }

            return Authorized(basicState, operationContext, ref message);
        }
 public override bool CheckAccess(OperationContext operationContext, ref Message message)
 {
     bool success = false;
     try
     {
         if (_parent != null)
         {
             success = _parent.CheckAccess(operationContext);
         }
         else
         {
             success = true;
         }
         return success;
     }
     finally
     {
         _requestLogger.LogIncomingRequest(operationContext, ref message, success);
     }
 }
 public abstract bool GetPassword(ref Message message, string username, out string password);
 public virtual string GetRealm(ref Message message)
 {
     return _realm;
 }
 public object GetInstance(InstanceContext instanceContext, Message message) => (GetInstance(instanceContext));