private bool DoDigestAuth(HttpListenerContext context)
        {
            var client       = context.Request.RemoteEndPoint.ToString().Split(':')[0];
            var parsedHeader = new DigestAuthHeaderValue(context);

            if (_InUseNonces.ContainsKey(client) && _InUseNonces[client].Item1 == parsedHeader.Nonce)
            {
                int lastNc = _InUseNonces[client].Item2;
                if (lastNc >= parsedHeader.Nc)
                {
                    // possible replay attack
                    return(false);
                }
            }
            else if (!_RecentNonces.Contains(parsedHeader.Nonce))
            {
                return(false); // Stale / non-issued nonce
            }

            _InUseNonces[client] = Tuple.Create(parsedHeader.Nonce, parsedHeader.Nc);
            _RecentNonces.Remove(parsedHeader.Nonce);
            return(ValidateUser(parsedHeader));
        }
 protected bool ValidateUser(DigestAuthHeaderValue headerValue)
 {
     return headerValue.ValidateAgainst(this);
 }
        private bool DoDigestAuth(HttpListenerContext context)
        {
            var client = context.Request.RemoteEndPoint.ToString().Split(':')[0];
            var parsedHeader = new DigestAuthHeaderValue(context);
            if (_InUseNonces.ContainsKey(client) && _InUseNonces[client].Item1 == parsedHeader.Nonce) {
                int lastNc = _InUseNonces[client].Item2;
                if (lastNc >= parsedHeader.Nc) {
                    // possible replay attack
                    return false;
                }
            } else if(!_RecentNonces.Contains(parsedHeader.Nonce)){
                return false; // Stale / non-issued nonce
            }

            _InUseNonces[client] = Tuple.Create(parsedHeader.Nonce, parsedHeader.Nc);
            _RecentNonces.Remove(parsedHeader.Nonce);
            return ValidateUser(parsedHeader);
        }