Защита изображений в ASP.NET MVC (с настраиваемым RouteHandler)

Я создал собственный RouteHandler для изображений, которые хочу защитить. Мой RouteHandler просто выбирает новый маршрут (graphics / {filename}) и выполняет поиск истинного пути к файлу, устанавливает тип mime и обслуживает его. Это нормально работает. (http://www.mikesdotnetting.com/Article/126/ASP.NET-MVC-Prevent-Image-Leeching-with-a-Custom-RouteHandler)

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

По сути, они передают логин (вводят код), который устанавливает переменную сеанса, которую я буду искать в пользовательском RouteHandler.

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

Наконец, мой вопрос: как я могу установить данные в контроллере и сделать их доступными для меня из пользовательского RouteHandler по последующему запросу?


person Brian David Berman    schedule 25.06.2010    source источник


Ответы (1)


Во-первых, из RequestContext, переданного методу GetHttpHandler, можете ли вы не получить доступ к сеансу через requestContext.HttpContext.Session? Я не уверен, я мог видеть, что это не работает по умолчанию, так как оно находится на ранней стадии разработки.

Если нет, вы всегда можете легко перенести логику проверки сеанса в обработчик, добавив IRequiresSessionState к вашему обработчику.

person Rex M    schedule 26.06.2010
comment
Как мне использовать IRequiresSessionState? Моя текущая настройка такова, что у меня есть класс ImageRouteHandler, который реализует IRouteHandler, а затем у меня просто есть метод GetHttpHandler, который обслуживает мое изображение. - person Brian David Berman; 29.06.2010
comment
@Brian ImageRouteHandler может выполнить проверку сеанса и вернуть 403 не авторизованный, который ваше приложение затем перехватывает и обрабатывает. Или вы можете настроить связанный IHttpHandler, в котором первый сеанс проверяет, а затем выполняет второй, если он считает, что это нормально. - person Rex M; 29.06.2010
comment
Я все еще получаю ноль при попытке сослаться на переменную сеанса из RouteHandler - person Brian David Berman; 29.06.2010
comment
@Brian, вы не получите сеанс от RouteHandler. Получите его от HttpHandler, как я отмечал во второй половине ответа. - person Rex M; 29.06.2010