ASP.NET MVC AuthorizeAttribute передачи значений в ActionMethod? - PullRequest
6 голосов
/ 14 мая 2010

Я только новичок в ASP.NET MVC и не уверен, как решить определенную задачу «правильным путем».

По сути, я храню зарегистрированный идентификатор пользователя в HttpContext.User.Identity и написал EnhancedAuthorizeAttribute для выполнения некоторой пользовательской авторизации.

В переопределенном методе OnAuthorization моя модель домена обращается к базе данных, чтобы гарантировать, что текущий идентификатор пользователя может получить доступ к переданному в routeValue «BatchCode». Прототип:

ReviewGroup GetReviewGroupFromBatchCode(string batchCode);

Он вернет ноль, если пользователь не сможет получить доступ к ReviewGroup, и OnAuthorization затем запретит доступ.

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

Я думаю о том, чтобы сохранить группу ReviewGroup в HttpContext.Items["reviewGroup"] и получить доступ к ней из контроллера в данный момент.

Это выполнимое решение, или я на неправильном пути?

Спасибо!

Ответы [ 3 ]

1 голос
/ 19 мая 2010

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

1 голос
/ 14 мая 2010

HttpContext.Items активен только на время запроса. Если вы хотите сохранить его в течение более длительного времени, вы должны поместить его в

а) сеанс - хорошо

б) профиль - не вижу преимущества

в) печенье - не рекомендуется

d) каждый раз попадать в базу данных - должно быть в порядке

Сохраните его в filterContext.RouteData.DataTokens?

0 голосов
/ 14 мая 2010

Если вы не сделаете ОЧЕНЬ большой выбор из ReviewGroup или у вас огромная база данных, то второй удар по базе данных не будет слишком большой проблемой. Современные базы данных очень эффективны при выборе, особенно с правильно проиндексированными таблицами.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...