Правильный способ иметь базу данных пользовательских запросов на пользовательские запросы на основе ролей на каждом запросе ASP.NET MVC
Вопрос
Это может быть немного невежественным вопросом, но я новичок в MVC, так что извините!
Я изучал модель Auth Auth Nerd, но в моем приложении у меня сложная аутентификация на основе ролей. Итак, что я делаю, так это:
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.
Проблема здесь Каждый раз, когда я создаю пользовательскую идентичность, я должен Запросите базу данных для ролей пользователей. Анкет Есть ли правильный Вперед или я делаю правильные вещи, чтобы запрашивать БД по каждому входящему запросу? Должен ли я сохранить список ролей в cookie или что -то в этом роде?
Я также действительно не понимаю весь жизненный цикл того, как формы Auth заботятся об аутентификации? Я использую то же самое IFormsAuthentication
Паттерн дизайна, который ужинал, и во время входа я звоню FormsAuth.SignIn()
который в свою очередь вызывает FormsAuthentication.SetAuthCookie
, Когда ему удастся вызвать membershipservice.validateuser()
Метод ?? Также, если Автомобильный файл был установлен Зачем ужинам Nerd создать билет, затем добавлять его в запрос, а затем прочитать его во время PostAuthenticationRequest
Чтобы проверить, какой это был пользователь. Операция билета как сеанс?
Спасибо! С Рождеством!
Обновлять : Эта ссылка дал мне немного лучшее понимание билета на аутентификацию форм.
Решение
Альтернативный подход состоит в том, чтобы хранить роли вашего пользователя в билете аутентификации, когда ваш пользователь будет аутентифицирован. Затем для каждого запроса (Application_AuthenticateRequest
Метод файла Global.asax) вы можете извлечь роли из билета аутентификации и создать GenericPrincipal
.
Смотрите этот ответ Больше подробностей.
Другие советы
"Правильный?" Это вопрос мнения.
Я бы сказал, что если у вас не возникает проблем с результатом работы базы данных, вызванной этим запросом, то не беспокойтесь об этом.
Если вы есть, вы можете централизовать свой код аутентификации в какого -то поставщика Auth Provider или Type, а также информация о аутентификации кэша в памяти, пока не обновит запись базы данных, которая должна одновременно аннулировать кэш.
(Ваш второй вопрос будет преуспеть само по себе; у меня недостаточно информации, чтобы ответить на него.)