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étodoPara 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.
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.