ASP.NET MVC - область или отдельное веб-приложение для администрирования?
До сих пор я использовал область MVC для администрации части моих приложений mvc, , но в последнее время я переосмыслил это из-за тот факт, что вы не можете иметь более одной конфигурации для проверки подлинности форм для каждого приложения.
Это стало проблемой, потому что в недавнем проекте я хотел установить, чтобы файлы cookie не сохранялись для пользователей, но я не хочу этого делать для пользователей администрирования. Я также не хочу, чтобы страница входа пользователя использовалась для доступа к средствам администрирования.
Я рассматриваю возможность создания отдельного проекта MVC в решении исключительно для инструментов администрирования. Мне кажется, что это лучший вариант, но мне интересно об осложнениях при развертывании. (В настоящее время я использую проект веб-развертывания в VS2008 для управления сборкой).
Кто-нибудь в настоящее время использует отдельный проект MVC для раздела администратора? Любые ошибки? Другие мнения о том, почему это не очень хорошая идея?
Спасибо.
Ответы
Ответ 1
Я всегда использую отдельный веб-сайт для администрирования. Но это прежде всего потому, что администрация для моих сайтов полностью отличается от использования и поэтому требует другого макета.
Еще одна положительная вещь заключается в том, что вам не нужно задаваться вопросом, могут ли пользователи изменять файлы, которые они не могут изменять, поскольку эти части не встроены в веб-сайт пользователя.
Обновление
Я имею в виду Layout with Razor или Masterpage с движком просмотра webforms.
Мы используем http://admin.domainname.com и http://www.domainname.com для разделения сайтов. Довольно легко настроить.
Разделение сайтов также делает контроллеры и представления намного чище, поскольку они обрабатывают задачи только для администраторов или пользователей. Не нужно много ifs (что в противном случае может быть очень легко добавить, если вы похожи на меня = ленивый кодер:)
Ответ 2
Формы auth cookie могут быть ограничены путём для области администрирования, но это может дать вам некоторую головную боль при работе с аутентификацией, но может быть возможно.
Другой вариант вместо использования admin.hostname.com или что-то в этом роде - использовать субприложение в /admin, однако это не обязательно решит вашу проблему.
Мы разработали наше веб-приложение как два разных сайта, главным образом потому, что нам нужна возможность разделить администрацию с фактическим сайтом, а также по причинам масштабируемости. Мы хотели иметь возможность масштабировать фактический веб-сайт, а не административную часть.
Мы столкнулись с следующими проблемами:
- Предварительный просмотр содержимого требует определенной логики, и вам может понадобиться сохранить фактическое имя хоста для сайта в какой-то конфигурации, чтобы перенаправить администратора на нужный сайт, а также обработать какой-либо маркер безопасности и т.д., так как пользователь не может быть аутентифицирован на сайте. Это намного проще, если вы находитесь на одном сайте (относительные пути и одна и та же проверка подлинности).
- Сайты, которые могут запускаться на нескольких веб-серверах одновременно (ака, веб-ферма), должны быть разработаны с учетом этого. Он включает такие вещи, как недействительность кеша, перезагрузку конфигурации или любые другие сохраненные данные приложения, которые могут быть "изменены" в вашем интерфейсе администрирования. Это, однако, проблема в любом подходе. Но если ваш сайт зависит от какой-либо запланированной работы или сторонней интеграции непосредственно в вашем веб-приложении, это может привести к некоторым проблемам, если ваш сайт/система администрирования запущен на нескольких серверах. Следовательно, может быть более целесообразным запустить административную систему в отказоустойчивом кластере HA IIS, но фактический веб-сайт (который подвержен высоким нагрузкам) на веб-ферме с балансировкой нагрузки. Это разделение настроек в пользу отдельных сайтов.
Я думаю, что по причинам масштабируемости вы должны рассмотреть вопрос о разделении проблем, однако все это зависит от дизайна вашего приложения, если это возможно или нет. Мы создаем структуру для определенного типа веб-сайтов, а это означает, что фактическая реализация дизайна отличается от каждого клиента, но мы хотели стандартизированный способ администрирования сайта, поэтому это был логичный выбор для нас.
Ответ 3
Метод FormsAuthentication.SetAuthCookie
позволяет вам контролировать, сохраняется ли он на всех сеансах или нет.
Если это админ, установите для этого параметра значение false
, в противном случае - true
.
Подробнее см. http://msdn.microsoft.com/en-us/library/twk5762b.aspx (второй параметр createPersistentCookie
управляет этим).
В терминах другой страницы входа для разных классов пользователя вы можете вернуть false из метода проверки подлинности, если они являются неправильным классом пользователя и имеют доступ к неправильной странице входа.
Вся эта логика должна произойти до того, как вы установите токен аутентификации.
Ответ 4
Я предпочел бы сохранить сайт администрирования по ряду причин:
- Потенциальные риски безопасности значительно сокращаются, так как доступ к чувствительным областям будет проще ограничивать и контролировать.
- В хорошем решении
Separation of Concerns
между слоями (служба/данные и т.д.) означает, что должно быть относительно просто подключить admin для доступа к функциям, доступным на вашем основном сайте.
- Разработчики, как правило, меньше озабочены полировкой своего сайта администратора, поскольку компании обычно сосредоточены на своих интерфейсных сайтах. Это означает, что небрежные ошибки, которые влияют на сайт администратора, с меньшей вероятностью влияют на основной.
- Я использую базовый контроллер с
AuthorizeAttribute
, что означает, что все действия (кроме login
!) не могут быть доступны внешним пользователям без соответствующих учетных данных. Индивидуальные действия затем переопределяются соответствующими учетными данными, если это необходимо, но в целом это подход "установить и забыть". Хотя у вас могут быть два базовых контроллера в односайтовом подходе, я считаю, что он будет немного менее управляемым.