To expand a bit on Darin's answer, the Web Forms Cookie auth is stateless. Your client is correct in stating that the framework does a lot of "magic" under the covers. That's not to say that the client can't do something about it, though.
By default, the Forms Auth cookie is stateless. It includes some kind of identifier (username, user id, that's up to the developer), and that's about it. There are many properties you can set on the cookie (is it a session cookie, how long is it good for, etc) but that doesn't affect how the contents of the cookie is treated. The cookie's contents are then encrypted and MACed by the machine key so they cannot be tampered with, but that doesn't prevent them from being portable or replayable.
The client can continue to use Forms Authentication if they want, they just need to step back a bit from all of the magic.
I presume under the covers they are doing something like FormsAuthentication.SetAuthCookie. Instead, they can create a FormsAuthenticationTicket which allows including user supplied data. This data can be something that's tied to a session (not necessarily, HTTP session). Then use FormsAuthentication.Encrypt to encrypt the ticket, and it gives back a cookie which can be set on an successful authentication response.
When a page loads (or better yet in Global.asax's Application_AuthorizeRequest) they can grab the cookie from the request, call FormsAuthentication.Decrypt to decrypt the authentication cookie, and check that the user data matches the session.
When the user explicitly signs out, clear the session from that user so it doesn't match the cookie anymore. Then the checking of the user data should reject the cookie and force them to acquire a new one.