Now this is an interesting question.
Since you use Angular, I assume you are familiar with the way services and factories work. They both act as a singleton meaning that there is only one instance at any point in time. This means that any time you store some data into a factory for example, it will be available in whichever controller you inject it effectively giving you state.
Imagine that you build your SPA in a very specific way. Most people don't dig too much into Angular and simply create a controller, access the scope, add methods and stuff in there and that's it, they're done.
Now imagine that you actually separate your code a bit. For anything that requires some functionality, you put that code into a service which you inject in whatever controller needs it. If you get some data and do some calculations, you store the result in the service and that data stays there. Of course, you can get rid of said data when the user logs out. Now, if the user hard refreshes the page with a ctrl-f5 then everything reloads and all the state saved up to that point is lost.
If you want to maintain state past a user hard refresh, you have to consider other alternatives.
You could use local storage which is an Html5 only thing which means support in modern browsers only.
But, one thing you always need to consider is that nothing you store on the client side will ever be truly safe simply because it lives on the client side which is not under your control.
If you don't like the idea of using local storage or cookie ( and I don't blame you for this ) you will have to introduce another layer where the session is actual stored and that would be a backend layer. Since you use dot net, you could create a simple MVC application, give it a few controllers which will probably mirror your web api one. Instead of calling the web api controller directly, you call the MVC one.
How does this help? Well Web Api is stateless, there won't be a session there since it makes no sense. But Mvc has Session and that's the one you can use.
So you add MVC, make your mvc controllers call the web api ones, they return JsonResult so they can be called the same way you would call a web api one and deal with the session, securely on the server side.
Choose whichever solution fits your bill most.