/// <summary>
 /// Configura o token valido.
 /// </summary>
 /// <param name="token"></param>
 /// <param name="checkResult">Resultado da verificação do </param>
 protected virtual void ConfigureValidToken(string token, Colosoft.Security.TokenConsultResult checkResult)
 {
     Colosoft.Security.UserContext.Current.SetAuth(checkResult.UserName, token);
     if (checkResult.ProfileId > 0)
     {
         Colosoft.Security.Profile.ProfileManager.SetCurrentProfile(new Lazy <Colosoft.Security.Profile.ProfileInfo>(() => checkResult.GetProfileInfo()), true);
     }
 }
 /// <summary>
 /// Valida o token informado.
 /// </summary>
 /// <param name="token"></param>
 /// <returns></returns>
 public static ValidateResult Validate(string token)
 {
     if (string.IsNullOrEmpty(token))
     {
         return(new ValidateResult {
             Success = false,
             Message = ResourceMessageFormatter.Create(() => Properties.Resources.FaultException_EmptyToken)
         });
     }
     Colosoft.Security.TokenConsultResult checkResult = null;
     try
     {
         checkResult = Colosoft.Security.Tokens.Check(token);
     }
     catch (Exception ex)
     {
         var message = ResourceMessageFormatter.Create(() => Properties.Resources.Exception_TokenCheckingError, Colosoft.Diagnostics.ExceptionFormatter.FormatException(ex, true));
         return(new ValidateResult {
             Success = false,
             Exception = ex,
             Message = message
         });
     }
     if (checkResult == null || !checkResult.Success)
     {
         return(new ValidateResult {
             Success = false,
             Message = ResourceMessageFormatter.Create(() => Properties.Resources.FaultException_InvalidToken, checkResult.Message)
         });
     }
     try
     {
         Colosoft.Security.UserContext.Current.SetAuth(checkResult.UserName, token);
         if (checkResult.ProfileId > 0)
         {
             Colosoft.Security.Profile.ProfileManager.SetCurrentProfile(new Lazy <Colosoft.Security.Profile.ProfileInfo>(() => checkResult.GetProfileInfo()), true);
         }
     }
     catch (Exception ex)
     {
         return(new ValidateResult {
             Success = false,
             Exception = ex,
             Message = ResourceMessageFormatter.Create(() => Properties.Resources.FaultException_SetAuthError)
         });
     }
     return(new ValidateResult {
         Success = true,
         TokenConsultResult = checkResult
     });
 }
        /// <summary>
        /// Método acionado depois de receber a mensagem do serviço.
        /// </summary>
        /// <param name="request">Dados da requisição da mensage.</param>
        /// <param name="channel">Canal usado na comunicação.</param>
        /// <param name="instanceContext">Contexto da instancia.</param>
        /// <returns></returns>
        public object AfterReceiveRequest(ref System.ServiceModel.Channels.Message request, System.ServiceModel.IClientChannel channel, System.ServiceModel.InstanceContext instanceContext)
        {
            string token = null;

            if (request.Properties.ContainsKey("httpRequest"))
            {
                var prop = (HttpRequestMessageProperty)request.Properties["httpRequest"];
                token = prop.Headers[TokenHeaderName];
            }
            if (string.IsNullOrEmpty(token))
            {
                var tokenHeaderIndex = request.Headers.FindHeader(TokenHeaderName, Namespace);
                if (tokenHeaderIndex >= 0)
                {
                    var headerReader = request.Headers.GetReaderAtHeader(tokenHeaderIndex);
                    token = headerReader.ReadElementContentAsString();
                }
            }
            if (string.IsNullOrEmpty(token))
            {
                var reason = new System.ServiceModel.FaultReason(ResourceMessageFormatter.Create(() => Properties.Resources.FaultException_EmptyToken).Format(System.Globalization.CultureInfo.CurrentCulture));
                var code   = new System.ServiceModel.FaultCode(EmptyTokenFaultReasonCode, Namespace);
                throw new System.ServiceModel.FaultException(reason, code);
            }
            Colosoft.Security.TokenConsultResult checkResult = null;
            try
            {
                checkResult = Colosoft.Security.Tokens.Check(token);
            }
            catch (Exception ex)
            {
                var message = ResourceMessageFormatter.Create(() => Properties.Resources.Exception_TokenCheckingError, Colosoft.Diagnostics.ExceptionFormatter.FormatException(ex, true)).Format();
                throw new Exception(message, ex);
            }
            if (checkResult == null || !checkResult.Success)
            {
                var reason = new System.ServiceModel.FaultReason(ResourceMessageFormatter.Create(() => Properties.Resources.FaultException_InvalidToken).Format(System.Globalization.CultureInfo.CurrentCulture) + " " + checkResult.Message);
                var code   = new System.ServiceModel.FaultCode(InvalidTokenFaultReasonCode, Namespace);
                throw new System.ServiceModel.FaultException(reason, code);
            }
            ConfigureValidToken(token, checkResult);
            return(null);
        }