Hi,
From your description I have concluded that you create an instance of GenericPrincipal, and assign it Three.CurrentPrincipal (correct?). If you do that, then it means that your generic principal will hold same type of principal which was in Thread.CurrentPrincipal. For this I recommend that you create a new principal object and pass it required data capturing it from either Thread.CurrentPrincipal or Request and then assign that instance to Thread.CurrentPrincipal again. You can create your own custom principal class, which can handle all other related items for you.