In my opinion such information as "current user id" is clearly session-related information and as such you won't ever be really independent from your session handling mechanism on the server side.
I guess it depends a little on how you separate your server-side functionality. In our case we have two clearly separated tiers called "system services" and "business logic". The system services layer handles user sessions and transactions. Usually business logic methods have the DataAccessAdapter and user info as parameters if they need them.
That way at least only the system services layer is dependent on the session handling mechanism.
Example:
// business logic method
void SaveUserNameInSomeTable(UserInfo userInfo, IDataAccessAdapter adapter) {
SomeTableEntity someTable = new SomeTableEntity();
someTable.UserName = userInfo.Name;
adapter.SaveEntity(someTable);
}
If you look at technologies more mature in the distributed systems area than .net, they usually have a "context" concept (I think COM+ has something like that too) where you can get context information from a predefined object, for example if your system services classes inherit from some base class. CORBA and J2EE have this concept, user sessions are handled in the base class and you inherit the "context" which contains session related info such as the current user id.
This is closely correlated to authorization & validation issues, i.e.: how do you know for sure who your user is.
Well anyway those were my 2 cents, hope it was of any use to you.
cheers
alvaro.-