<p>I am wanting to store the "state" of some actions the user is performing in a series of different ASP.Net webforms.  What are my choices for persisting state, and what are the pros/cons of each solution?</p>

<p>I have been using Session objects, and using some helper methods to strongly type the objects:</p>

<pre><code>    public static Account GetCurrentAccount(HttpSessionState session)
    {
        return (Account)session[ACCOUNT];
    }

    public static void SetCurrentAccount(Account obj, HttpSessionState session)
    {
        session[ACCOUNT] = obj;
    }
</code></pre>

<p>I have been told by numerous sources that "Session is evil", so that is really the root cause of this question.  I want to know what you think "best practice", and why.</p>

As for "Session being evil" ... if you were developing in classic ASP I would have to agree, but ASP.NET/IIS does a much better job.
The real question is what is the best way to maintain state.  In our case, when it comes to the current logged in user, we store that object in Session, as we are
constantly
referring to it for their name, email address, authorization and so forth.
Other little
tidbits
of information that doesn't need any long-term persistence we use a combination of cookies and viewstate.