Session state is an established concept, yes, but detecting the expiration of sessions is not. None of the examples you have listed (shopping carts, security or various other forms of data) require or even benefit from such functionality. If the session ends it is eventually recycled by the server.
The most common reasons for sessions recycling is the browser being closed or the user navigating to a page or file on another Web site. I'm sure you know this, and am not suggesting that you do not. However, it's worth noting that if the user is no longer using your application, there is no need for additional processing to occur (in the vast majority of cases).
If your application(s) require things like "Products you saw the last time you were here" (in reference to a shopping cart) you'll want to look at a timestamp-based solution, in which simple comparison logic can be used. This is one of the more common reasons for people stating that they "need" to detect session expirations, when in fact they do not.
Authorization simply shouldn't be implemented in session state (your second example). Authorization data isn't user data and shouldn't be kept as such. Authorization doesn't exist for -a- user; it exists to protect every other user, and as such should be treated as application data, not user data.
Other forms of data (your third example) should be kept in the application's data store (usually a database) if these pieces of data are in fact important at all. This is a common place for session misallocation. I've seen developers stick the weirdest things in session state: browser data (context), the current time (context), connection strings (application data), form data (page data), DataSets (page data), etc. Again, the data itself doesn't need to be changed simply because the user's session expires.
However, if you're still dead set on supporting session expiration, a crude combination of the System.Web.SessionState.SessionModule.End event and some "onunload" JavaScript which invokes a Web request back to the server will work most of the time. Just remember that the Web is inherently stateless. Trying to trick things with cheap hacks is never the best approach.