I know that this question is a bit outdated at the moment and already has an accepted answer, but I would like to talk about my thoughts and how we are now doing something with a similar setting.
Initially, we went through the same process as you and included a fair bit of user data in the cookie. This process shortened our trips through the databases, but in the end we got into an error when some users could not log in at all, while others could. It turns out that cookies were silently deleted when they moved to a certain size due to our serialized data.
Our current process is a two-tier caching system. We store the user database identifier in a cookie as User.Identity.Name , and then in PostAuthenticateRequest, we try to get user information from the local ASP.net cache, returning to the distributed Redis cache. The local cache is in proc and is stored for 15 seconds (therefore, for repeated requests, it is not necessary to go through the wire to Redis). The Redis cache is kept for a day and is not valid during the upgrade. If both of them are skipped, we then load the information from SQL Server.
Then we delete this user information in the user IPrincipal, and everything works like a charm. This seems to work very well for us on a site with a fairly high level of usage.
MattGWagner
source share