The reason is "Session swapping". Basically, it is possible for users to end up with other user's sessions. The result of this can be unnoticed or it can result in users viewing confidential information.
I do not have an exact technical reference for this from MSDN, but have seen it happen "in the wild" before. A quick google search produces a lot of results. Here is one example: http://forums.asp.net/t/1519279.aspx
However, it all depends on how you implement your sessions. In the end, sessions are just a version of caching, so best practice would dictate that this cache does not take place in system memory (the default version of this being "InProc"). In order to follow best practice, it would be advised to setup a server specifically for maintaining sessions which was backed by a database.
In the end, it is not the facility of a session, but it is the "InProc" setting, which is advised against.