интересное нестандартное мышление. хотя меня беспокоит весь остальной дополнительный код, который мне нужно написать для добавления и управления ролями для пользователя в панели администратора ...
рабатываю сложный веб-сайт с пользователями, имеющими несколько ролей. Пользователи также связаны с другими элементами в БД, которые вместе с их ролями определяют, что они могут видеть и делать на веб-сайте.
Теперь некоторые пользователи имеют более одной роли, но веб-сайт может обрабатывать только одну роль за раз из-за сложной структуры.
Идея состоит в том, что пользователь входит в систему и имеет выпадающий список в углу веб-сайта, где он может выбрать одну из своих ролей. если у него только одна роль, выпадающего списка нет.
Теперь я сохраняю последнее выбранное значение роли в БД вместе с другими его настройками пользователя. Когда он возвращается, таким образом роль все еще помнят.
Значение раскрывающегося списка должно быть доступно по всему сайту. Я хочу сделать 2 вещи:
Сохранить текущую роль вSession
.ПереопределитьIsInRole
метод или написатьIsCurrentlyInRole
метод, чтобы проверить весь доступ к текущей выбранной роли, а не все роли, как это делает оригиналIsInRole
методДля хранения в части сессии я думал, что было бы хорошо сделать это вGlobal.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;
}
}
}
}
}
но, очевидно, это дает ошибки во время выполнения.Session state is not available in this context.
IPrincipal
?) с участиемIsCurrentlyInRole
без потери всей другой функциональностиМожет быть, я делаю все это неправильно, и есть лучший способ сделать это?Любая помощь очень ценится.