One solution is adding a hidden element to your page where you store the tick from when your timer last run, i.e. the first read, when the timer was running like it should (count 20 minutes from.)
https://msdn.microsoft.com/en-us/library/system.datetime.ticks(v=vs.110).aspx[
^]
Then when posting back you'll known at what time that client last had it's 20 minutes event and when that time has passed, you'll do whatever you want to do ever 20th minute and set it to a new DateTime.UtcNow.Ticks value
But you kind have to forget the notion of a timer. Because your pages are executed on server, the timer wont really work well, better to use some javascript that will make a TimeOut of the appropriate length based on how much time is left of the next 20 minute slot.
http://www.w3schools.com/js/js_timing.asp[
^]
This timeout will happen at the client, so it will catch 20 minutes passing.
The next problem is navigating, since that is HTTP GET you're not passing values to the server unless in your querystring to inform them of what moment that client had last 20 minute action happening. Then your options are to base it on a cookie instead, which is kind last resort as those can be turned off, adding a custom bit to your querystring, which is not a miracle for SEO crawling (ugly urls don't rank well).
Ultimately for a durable solution for both scenarios, you'll need some static-like object or DB entity tracking the different client and their last 'tick_of_action' and upon request consider if now is when, possibly even monitored, in case you want the event to happen even if they left the site.