Ejemplo n.º 1
0
        private RequestValidationResult GetVaidationErrorResult(
            string customerId,
            string targetUrl,
            QueueEventConfig config,
            QueueUrlParams qParams,
            string errorCode)
        {
            var query = GetQueryString(customerId, config.EventId, config.Version, config.Culture, config.LayoutName) +
                        $"&queueittoken={qParams.QueueITToken}" +
                        $"&ts={DateTimeHelper.GetUnixTimeStampFromDate(DateTime.UtcNow)}" +
                        (!string.IsNullOrEmpty(targetUrl) ? $"&t={HttpUtility.UrlEncode(targetUrl)}" : "");

            var domainAlias = config.QueueDomain;

            if (!domainAlias.EndsWith("/"))
            {
                domainAlias = domainAlias + "/";
            }

            var redirectUrl = $"https://{domainAlias}error/{errorCode}/?{query}";

            return(new RequestValidationResult(ActionType.QueueAction)
            {
                RedirectUrl = redirectUrl,
                EventId = config.EventId
            });
        }
        private RequestValidationResult GetVaidationErrorResult(
            string customerId,
            string targetUrl,
            EventConfig config,
            QueueUrlParams qParams,
            string errorCode)
        {
            var query = GetQueryString(customerId, config) +
                        $"&queueittoken={qParams.QueueITToken}" +
                        $"&ts={DateTimeHelper.GetUnixTimeStampFromDate(DateTime.UtcNow)}" +
                        $"&t={HttpUtility.UrlEncode(targetUrl)}";
            var domainAlias = config.QueueDomain;

            if (!domainAlias.EndsWith("/"))
            {
                domainAlias = domainAlias + "/";
            }
            var redirectUrl = "https://" + domainAlias + $"error/{errorCode}?" + query;

            return(new RequestValidationResult()
            {
                RedirectUrl = redirectUrl,
                EventId = config.EventId
            });
        }
        public RequestValidationResult ValidateQueueRequest(
            string targetUrl,
            string queueitToken,
            QueueEventConfig config,
            string customerId,
            string secretKey)
        {
            var state = _userInQueueStateRepository.GetState(config.EventId, config.CookieValidityMinute, secretKey);

            if (state.IsValid)
            {
                if (state.IsStateExtendable && config.ExtendCookieValidity)
                {
                    _userInQueueStateRepository.Store(config.EventId,
                                                      state.QueueId,
                                                      null,
                                                      config.CookieDomain,
                                                      state.RedirectType,
                                                      secretKey);
                }
                return(new RequestValidationResult(ActionType.QueueAction,
                                                   eventId: config.EventId,
                                                   queueId: state.QueueId,
                                                   redirectType: state.RedirectType,
                                                   actionName: config.ActionName));
            }
            QueueUrlParams queueParams = QueueParameterHelper.ExtractQueueParams(queueitToken);

            RequestValidationResult requestValidationResult;
            bool isTokenValid = false;

            if (queueParams != null)
            {
                var tokenValidationResult = ValidateToken(config, queueParams, secretKey);
                isTokenValid = tokenValidationResult.IsValid;

                if (isTokenValid)
                {
                    requestValidationResult = GetValidTokenResult(config, queueParams, secretKey);
                }
                else
                {
                    requestValidationResult = GetErrorResult(customerId, targetUrl, config, queueParams, tokenValidationResult.ErrorCode);
                }
            }
            else
            {
                requestValidationResult = GetQueueResult(targetUrl, config, customerId);
            }

            if (state.IsFound && !isTokenValid)
            {
                _userInQueueStateRepository.CancelQueueCookie(config.EventId, config.CookieDomain);
            }

            return(requestValidationResult);
        }
        private RequestValidationResult GetErrorResult(
            string customerId,
            string targetUrl,
            QueueEventConfig config,
            QueueUrlParams qParams,
            string errorCode)
        {
            var query = GetQueryString(customerId, config.EventId, config.Version, config.ActionName, config.Culture, config.LayoutName) +
                        $"&queueittoken={qParams.QueueITToken}" +
                        $"&ts={DateTimeHelper.GetUnixTimeStampFromDate(DateTime.UtcNow)}" +
                        (!string.IsNullOrEmpty(targetUrl) ? $"&t={Uri.EscapeDataString(targetUrl)}" : "");

            var redirectUrl = GenerateRedirectUrl(config.QueueDomain, $"error/{errorCode}/", query);

            return(new RequestValidationResult(
                       ActionType.QueueAction,
                       redirectUrl: redirectUrl,
                       eventId: config.EventId,
                       actionName: config.ActionName));
        }
        private RequestValidationResult GetValidTokenResult(
            QueueEventConfig config,
            QueueUrlParams queueParams,
            string secretKey)
        {
            _userInQueueStateRepository.Store(
                config.EventId,
                queueParams.QueueId,
                queueParams.CookieValidityMinutes,
                config.CookieDomain,
                queueParams.RedirectType,
                secretKey);

            return(new RequestValidationResult(
                       ActionType.QueueAction,
                       eventId: config.EventId,
                       queueId: queueParams.QueueId,
                       redirectType: queueParams.RedirectType,
                       actionName: config.ActionName));
        }
        private RequestValidationResult GetQueueITTokenValidationResult(
            string targetUrl,
            string eventId,
            QueueEventConfig config,
            QueueUrlParams queueParams,
            string customerId,
            string secretKey)
        {
            string calculatedHash = HashHelper.GenerateSHA256Hash(secretKey, queueParams.QueueITTokenWithoutHash);

            if (calculatedHash != queueParams.HashCode)
            {
                return(GetVaidationErrorResult(customerId, targetUrl, config, queueParams, "hash"));
            }

            if (queueParams.EventId != eventId)
            {
                return(GetVaidationErrorResult(customerId, targetUrl, config, queueParams, "eventid"));
            }

            if (queueParams.TimeStamp < DateTime.UtcNow)
            {
                return(GetVaidationErrorResult(customerId, targetUrl, config, queueParams, "timestamp"));
            }

            this._userInQueueStateRepository.Store(
                config.EventId,
                queueParams.QueueId,
                queueParams.CookieValidityMinutes,
                config.CookieDomain,
                queueParams.RedirectType,
                secretKey,
                config.CookieHttpOnly);

            return(new RequestValidationResult(ActionType.QueueAction)
            {
                EventId = config.EventId,
                QueueId = queueParams.QueueId,
                RedirectType = queueParams.RedirectType
            });
        }
        public RequestValidationResult ValidateQueueRequest(
            string targetUrl,
            string queueitToken,
            QueueEventConfig config,
            string customerId,
            string secretKey)
        {
            var state = _userInQueueStateRepository.GetState(config.EventId, config.CookieValidityMinute, secretKey);

            if (state.IsValid)
            {
                if (state.IsStateExtendable && config.ExtendCookieValidity)
                {
                    this._userInQueueStateRepository.Store(config.EventId,
                                                           state.QueueId,
                                                           null,
                                                           config.CookieDomain,
                                                           state.RedirectType,
                                                           secretKey,
                                                           config.CookieHttpOnly);
                }
                return(new RequestValidationResult(ActionType.QueueAction)
                {
                    EventId = config.EventId,
                    QueueId = state.QueueId,
                    RedirectType = state.RedirectType
                });
            }

            QueueUrlParams queueParmas = QueueParameterHelper.ExtractQueueParams(queueitToken);

            if (queueParmas != null)
            {
                return(GetQueueITTokenValidationResult(targetUrl, config.EventId, config, queueParmas, customerId, secretKey));
            }
            else
            {
                return(GetInQueueRedirectResult(targetUrl, config, customerId));
            }
        }
        private TokenValidationResult ValidateToken(
            QueueEventConfig config,
            QueueUrlParams queueParams,
            string secretKey)
        {
            string calculatedHash = HashHelper.GenerateSHA256Hash(secretKey, queueParams.QueueITTokenWithoutHash);

            if (calculatedHash != queueParams.HashCode)
            {
                return(new TokenValidationResult(false, "hash"));
            }

            if (queueParams.EventId != config.EventId)
            {
                return(new TokenValidationResult(false, "eventid"));
            }

            if (queueParams.TimeStamp < DateTime.UtcNow)
            {
                return(new TokenValidationResult(false, "timestamp"));
            }

            return(new TokenValidationResult(true, null));
        }
Ejemplo n.º 9
0
        public static QueueUrlParams ExtractQueueParams(string queueitToken)
        {
            try
            {
                if (string.IsNullOrEmpty(queueitToken))
                {
                    return(null);
                }

                QueueUrlParams result = new QueueUrlParams()
                {
                    QueueITToken = queueitToken
                };
                var paramList = result.QueueITToken.Split(KeyValueSeparatorGroupChar);
                foreach (var paramKeyValue in paramList)
                {
                    var keyValueArr = paramKeyValue.Split(KeyValueSeparatorChar);

                    switch (keyValueArr[0])
                    {
                    case TimeStampKey:
                        result.TimeStamp = DateTimeHelper.GetUnixTimeStampAsDate(keyValueArr[1]);
                        break;

                    case CookieValidityMinuteKey:
                    {
                        int cookieValidity = 0;
                        if (int.TryParse(keyValueArr[1], out cookieValidity))
                        {
                            result.CookieValidityMinute = cookieValidity;
                        }
                        else
                        {
                            result.CookieValidityMinute = null;
                        }
                        break;
                    }

                    case EventIdKey:
                        result.EventId = keyValueArr[1];
                        break;

                    case ExtendableCookieKey:
                    {
                        bool extendCookie;
                        if (!bool.TryParse(keyValueArr[1], out extendCookie))
                        {
                            extendCookie = false;
                        }
                        result.ExtendableCookie = extendCookie;
                        break;
                    }

                    case HashKey:
                        result.HashCode = keyValueArr[1];
                        break;

                    case QueueIdKey:
                        result.QueueId = keyValueArr[1];
                        break;
                    }
                }

                result.QueueITTokenWithoutHash =
                    result.QueueITToken.Replace($"{KeyValueSeparatorGroupChar}{HashKey}{KeyValueSeparatorChar}{result.HashCode}", "");
                return(result);
            }
            catch
            {
                return(null);
            }
        }