Asp.net MVC Permitir al usuario cambiar entre roles

Estoy desarrollando un sitio web complejo con usuarios que tienen múltiples roles. Los usuarios también están acoplados a otros elementos en la base de datos que, junto con sus roles, definirán lo que pueden ver y hacer en el sitio web.

Ahora, algunos usuarios tienen más de 1 rol, pero el sitio web solo puede manejar 1 rol a la vez debido a la compleja estructura.

la idea es que un usuario inicia sesión y tiene un menú desplegable en la esquina del sitio web donde puede seleccionar uno de sus roles. si solo tiene 1 rol, no hay menú desplegable.

Ahora guardo el último valor de rol seleccionado en la base de datos con el usuario sus otras configuraciones. Cuando regresa, de esta manera el papel aún se recuerda.

El valor del menú desplegable debe ser accesible en todo el sitio web. Quiero hacer 2 cosas:

Almacenar el rol actual en unSession.Sobre laIsInRole método o escriba unIsCurrentlyInRole para verificar todo el acceso al rol seleccionado actualmente, y no todos los roles, como lo hace el @ originIsInRole método

Para la parte de Almacenamiento en sesión, pensé que sería bueno hacerlo enGlobal.asax

    protected void Application_AuthenticateRequest(Object sender, EventArgs e) {
        if (User != null && User.Identity.IsAuthenticated) {
            //check for roles session.
            if (Session["CurrentRole"] == null) {
                NASDataContext _db = new NASDataContext();
                var userparams = _db.aspnet_Users.First(q => q.LoweredUserName == User.Identity.Name).UserParam;
                if (userparams.US_HuidigeRol.HasValue) {
                    var role = userparams.aspnet_Role;
                    if (User.IsInRole(role.LoweredRoleName)) {
                        //safe
                        Session["CurrentRole"] = role.LoweredRoleName;
                    } else {
                        userparams.US_HuidigeRol = null;
                        _db.SubmitChanges();
                    }
                } else {
                    //no value
                    //check amount of roles
                    string[] roles = Roles.GetRolesForUser(userparams.aspnet_User.UserName);
                    if (roles.Length > 0) {
                        var role = _db.aspnet_Roles.First(q => q.LoweredRoleName == roles[0].ToLower());
                        userparams.US_HuidigeRol = role.RoleId;
                        Session["CurrentRole"] = role.LoweredRoleName;
                    }
                }
            }

        }
    }

pero aparentemente esto da errores de tiempo de ejecución. @Session state is not available in this context.

¿Cómo soluciono esto, y este es realmente el mejor lugar para poner este código?¿Cómo extiendo al usuario IPrincipal?) conIsCurrentlyInRole sin perder todas las demás funcionalidadesQuizás estoy haciendo todo esto mal y hay una mejor manera de hacerl

Cualquier ayuda es muy apreciada

Respuestas a la pregunta(2)

Su respuesta a la pregunta