MVC2 Routing and Security: как безопасно передавать параметры? - PullRequest
0 голосов
/ 07 января 2011

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

Допустим, у меня есть новостной сайт со статьями. В этом случае URL в форме mynewssite.com/Articles/123 работает просто замечательно, потому что мне все равно, кто какую статью просматривает. Пользователь может изменить ArticleID в URL-адресе на любой другой, который он хочет, и открыть эту статью. В моем случае, однако, я только хочу, чтобы пользователь мог просматривать / редактировать объекты данных (статьи или что-то еще), которые принадлежат ему. Чтобы добиться этого, я использую их UserID (GUID) в качестве внешнего ключа в базе данных и отображаю список их данных для их выбора. Здесь возникает проблема ... когда они нажимают на ссылку, созданную Url.Action («Редактировать», New With {.id = item.id}) (я не использую ActionLink, потому что мне нужно добавить HTML-контент внутри ссылки) идентификатор отображается как параметр строки запроса. Я мог бы добавить маршрут для него, но идентификатор все равно будет отображаться в URL, чтобы они могли вмешиваться. Очевидное следствие заключается в том, что, изменяя URL, они могут просматривать / редактировать любую сущность, которую хотят.

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

Этот вопрос слишком широкий? Пожалуйста, дайте мне знать, какие особенности вам нужны. Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 января 2011

Даже в Winforms вам придется добавлять специальную логику к каждому запросу, чтобы фильтровать только статьи, которыми владеет пользователь.Я не понимаю, почему MVC должен быть другим.Конечно, вы можете использовать web.config, чтобы запретить доступ к данным URL-адресам, но не тогда, когда вы используете одну страницу, которая принимает параметр того, какие данные показывать.

Лучше всего, вероятно, фильтровать это в базе данных.уровень.Добавив предложение where, содержащее идентификатор пользователя, приложение вернет ошибку типа «нет записей», и вы сможете делать с ней все, что захотите.

0 голосов
/ 07 января 2011

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

...