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étodoPara 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.
IPrincipal
?) conIsCurrentlyInRole
sin perder todas las demás funcionalidadesQuizás estoy haciendo todo esto mal y hay una mejor manera de hacerlCualquier ayuda es muy apreciada