интересное нестандартное мышление. хотя меня беспокоит весь остальной дополнительный код, который мне нужно написать для добавления и управления ролями для пользователя в панели администратора ...

рабатываю сложный веб-сайт с пользователями, имеющими несколько ролей. Пользователи также связаны с другими элементами в БД, которые вместе с их ролями определяют, что они могут видеть и делать на веб-сайте.

Теперь некоторые пользователи имеют более одной роли, но веб-сайт может обрабатывать только одну роль за раз из-за сложной структуры.

Идея состоит в том, что пользователь входит в систему и имеет выпадающий список в углу веб-сайта, где он может выбрать одну из своих ролей. если у него только одна роль, выпадающего списка нет.

Теперь я сохраняю последнее выбранное значение роли в БД вместе с другими его настройками пользователя. Когда он возвращается, таким образом роль все еще помнят.

Значение раскрывающегося списка должно быть доступно по всему сайту. Я хочу сделать 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 без потери всей другой функциональностиМожет быть, я делаю все это неправильно, и есть лучший способ сделать это?

Любая помощь очень ценится.

Ответы на вопрос(2)

Ваш ответ на вопрос