правильный способ иметь базу данных пользовательских запросов на основе ролей для каждого запроса asp.net mvc - PullRequest
3 голосов
/ 25 декабря 2010

Это может быть слегка неосведомленный вопрос, но я новичок в mvc, поэтому извините!

Я изучил модель аутентификации обеда для ботаников, но в моем приложении у меня сложная аутентификация на основе ролей.Итак, что я делаю, это:

 void MvcApplication_PostAuthenticateRequest(object sender, EventArgs e)
        {
            HttpCookie authCookie = HttpContext.Current.Request
               .Cookies[FormsAuthentication.FormsCookieName];
            if (authCookie != null)
            {
                string encTicket = authCookie.Value;
                if (!String.IsNullOrEmpty(encTicket))
                {
                    FormsAuthenticationTicket ticket = 
                            FormsAuthentication.Decrypt(encTicket);
                    CustomIdentity id = new CustomIdentity(ticket.Name);
                    GenericPrincipal prin = new GenericPrincipal(id, id.Roles);
                    HttpContext.Current.User = prin;
                }
            }
        }

При входе в систему я аутентифицирую имя пользователя / пароль с помощью FormsAuth, а затем создаю cookie.

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

Я также не совсем понимаю весь жизненный цикл того, как аутентификация форм заботится об аутентификации?Я использую тот же самый шаблон проектирования IFormsAuthentication, что и пользователи ужина, и во время входа в систему я звоню FormsAuth.SignIn(), что, в свою очередь, вызывает FormsAuthentication.SetAuthCookie. Когда ему удается вызвать метод membershipservice.validateuser() ??Кроме того, если для auth cookie установлено , зачем ботанику создать билет, затем добавить его в запрос и затем прочитать его во время PostAuthenticationRequest, чтобы узнать, каким пользователем он был.Работает ли билет как сессия?

Спасибо!С Рождеством!


Обновление : Эта ссылка дала мне немного лучшее представление о билете проверки подлинности с помощью форм.

Ответы [ 2 ]

3 голосов
/ 25 декабря 2010

"Правильно?" Это вопрос мнения.

Я бы сказал, что если у вас нет проблем с производительностью базы данных, вызванных этим запросом, не беспокойтесь об этом.

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

(Ваш второй вопрос будет успешен сам по себе; у меня недостаточно информации, чтобы ответить на него.)

2 голосов
/ 26 декабря 2010

Альтернативный подход заключается в сохранении ролей вашего пользователя в билете аутентификации, когда ваш пользователь аутентифицирован. Затем для каждого запроса (Application_AuthenticateRequest метод файла global.asax) вы можете извлечь роли из билета аутентификации и создать GenericPrincipal.

См. Этот ответ для более подробной информации.

...