asp.net заставляет настраиваемого поставщика ролей (авторизоваться) вести себя как настраиваемый поставщик членства (аутентифицировать) по истечении срока - PullRequest
0 голосов
/ 28 мая 2011

У меня проверка подлинности формы работает нормально с установкой истечения срока действия файла cookie за 3 месяца:

FormsAuthentication.Initialize();
FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, this.txtUsername.Text, DateTime.Now
                    , DateTime.Now.AddMonths(3), true, string.Empty);

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

как для провайдера пользовательских ролей [авторизующая часть], когда логин пользователя isValid (), я добавляю переменную сеанса:

HttpContext.Current.Session.Add("userinfo", userInfo);

, но, как мы знаем, срок действия сеанса истекает после изменения web.config,сборка проекта, перезагрузка IIS или 20 минут по умолчанию.

все, что я хочу, - это заставить систему сохранять сеанс ["userinfo"] так же, как аутентификация [cookie], но, конечно, без установки userinfo в cookie, потому что этонебезопасно, даже если userId считается брешей в безопасности и хранится в cookie!

, как это сделать?я думал сохранить идентификатор пользователя в cookie, но зашифровал его, если я обнаружил, что сессия истекла, но пользователь все еще аутентифицирован, я перезагружу userInfo из БД, но достаточно ли это хороший или лучший подход?а как насчет хранения userInfo в authTicked в (string.Empty) в приведенном выше фрагменте кода, доступно позже и как его использовать?

1 Ответ

0 голосов
/ 28 мая 2011

хорошо, звучит, никто не ответил!поэтому я решил сохранить userId в разделе пользовательских данных билета авторизации:

FormsAuthenticationTicket authTicket = new FormsAuthenticationTicket(1, this.txtUsername.Text, DateTime.Now
                , DateTime.Now.AddMonths(3), true, UserInfo.UserId.ToString());

, затем, когда мне нужно проверить userInfo, я использую следующее свойство:

public UserInformation UserInfo
    {
        get
        {
            if (Session["userinfo"] == null)
            {
                FormsIdentity id = (FormsIdentity)User.Identity;
                FormsAuthenticationTicket ticket = id.Ticket;
                long userId = Convert.ToInt64(ticket.UserData);
                Session["userinfo"]=new MySqlMembershipProvider().LoadUserInfo(userId);
            }
            return (UserInformation)Session["userinfo"];
        }
    }

это все.я думал о провайдере профилей, но мне не нравилась идея извлечения пользовательских разрешений из db [структура 9 таблиц], а затем их повторное сохранение в записи в таблицах сессий [это как вращение вокруг себя], если пользователь не обновил perms или prefsтребуется больше дб хитов !!

...