Asp.net MVC Permite que o usuário alterne entre funções

Estou desenvolvendo um site complexo com usuários com várias funções. Os usuários também são acoplados a outros itens no banco de dados que, juntamente com suas funções, definirão o que podem ver e fazer no site.

Agora, alguns usuários têm mais de uma função, mas o site pode lidar apenas com uma função por vez, devido à estrutura complexa.

a ideia é que um usuário efetue login e tenha uma lista suspensa no canto do site, onde poderá selecionar uma de suas funções. se ele tem apenas 1 papel, não há lista suspensa.

Agora, guardo o último valor da função selecionada no banco de dados com o usuário em suas outras configurações. Quando ele volta, dessa maneira o papel ainda é lembrado.

O valor da lista suspensa deve estar acessível em todo o site. Eu quero fazer 2 coisas:

Armazene a função atual em umSession.Substitua oIsInRole método ou escreva umIsCurrentlyInRole método para verificar todo o acesso à função selecionada no momento, e nem todas as funções, como faz o originalIsInRole método

Para a parte Armazenando na sessão, pensei que seria bom fazer isso emGlobal.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;
                    }
                }
            }

        }
    }

mas aparentemente isso gera erros de tempo de execução.Session state is not available in this context.

Como faço para corrigir isso e esse é realmente o melhor lugar para colocar esse código?Como estender o usuário (IPrincipal?) comIsCurrentlyInRole sem perder todas as outras funcionalidadesTalvez eu esteja fazendo tudo errado e haja uma maneira melhor de fazer isso?

Qualquer ajuda é muito apreciada.

questionAnswers(2)

yourAnswerToTheQuestion