Я хочу использовать RequireHttpsAttribute, чтобы предотвратить отправку незащищенных HTTP-запросов методу действия.
C #
[RequireHttps] //apply to all actions in controller
public class SomeController
{
[RequireHttps] //apply to this action only
public ActionResult SomeAction()
{
...
}
}
VB
<RequireHttps()> _
Public Class SomeController
<RequireHttps()> _
Public Function SomeAction() As ActionResult
...
End Function
End Class
К сожалению, сервер разработки ASP.NET не поддерживает HTTPS.
Как я могу заставить мое приложение ASP.NET MVC использовать RequireHttps при публикации в производственной среде, но не при запуске на моей рабочей станции разработки на сервере разработки ASP.NET?
asp.net-mvc
visual-studio
ssl
https
Зак Петерсон
источник
источник
Ответы:
Это не поможет, если вы запустите сборки Release на своей рабочей станции, но условная компиляция может сработать ...
Обновить
В Visual Basic атрибуты технически являются частью той же строки, что и определение, к которому они применяются. Вы не можете помещать операторы условной компиляции внутри строки, поэтому вам приходится писать объявление функции дважды - один раз с атрибутом, а другой - без него. Однако это работает, если вы не возражаете против уродства.
Обновление 2
Несколько человек упомянули получение на основе,
RequireHttpsAttribute
не приведя примера, так что вот вам один. Я думаю, что этот подход был бы намного чище, чем подход условной компиляции, и я бы предпочел его на вашем месте.ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: я не тестировал этот код, даже немного, и мой VB довольно ржавый. Все, что я знаю, это то, что он компилируется. Я написал его, основываясь на предложениях Spot, Queen3 и Ланса Фишера. Если это не сработает, это должно хотя бы передать общую идею и дать вам отправную точку.
По сути, новый атрибут просто завершает работу вместо запуска кода авторизации SSL по умолчанию, если текущий запрос является локальным (то есть вы получаете доступ к сайту через localhost). Вы можете использовать это так:
Намного чище! При условии, что мой непроверенный код действительно работает.
источник
Если кому нужна версия C #:
источник
filters.Add(new MyRequireHttpsAttribute ());
вFilterConfig
?Унаследование от RequireHttps - хороший подход.
Чтобы полностью обойти проблему, вы можете использовать IIS на своем локальном компьютере с самозаверяющим сертификатом. IIS быстрее, чем встроенный веб-сервер, и у вас есть преимущество в том, что ваша среда разработки больше похожа на производственную.
У Скотта Хансельмана есть отличный ресурс о нескольких способах реализации локального HTTPS с VS2010 и IIS Express.
источник
Полагаю, вы могли бы сделать это, используя систему фильтров MVC и Global.asax.cs ...
источник
Поскольку именно сервер разработки ASP.Net вызвал вашу проблему в первую очередь, стоит отметить, что у Microsoft теперь есть IIS Express , который поставляется с Visual Studio (начиная с VS2010 SP1). Это урезанная версия IIS, которая так же проста в использовании, как и сервер разработки, но поддерживает полный набор функций IIS 7.5, включая SSL.
У Скотта Хансельмана есть подробный пост о работе с SSL в IIS Express .
источник
Как насчет наследования атрибута RequireHttps в настраиваемом атрибуте. Затем внутри настраиваемого атрибута проверьте свойство IsLocal текущего запроса, чтобы узнать, исходит ли запрос с локального компьютера. Если да, то не применяйте базовую функциональность. В противном случае вызовите базовую операцию.
источник
Это сработало для меня, MVC 6 (ASP.NET Core 1.0) . Код проверяет, находится ли отладка в разработке, а если нет, ssl не требуется. Все правки находятся в Startup.cs .
Добавить:
Добавить:
Редактировать:
источник
Если вы можете получить и переопределить - сделайте это. Если вы не можете - MVC поставляется с источниками, просто возьмите источники и создайте свой собственный атрибут [ForceHttps], который проверяет IsLocal.
источник
Для MVC 3 я добавил свой собственный FilterProvider (на основе кода, найденного здесь: глобальные и условные фильтры, которые, помимо прочего (отображение информации об отладке для локальных пользователей и т. Д.), Будут украшать все действия с помощью
RequireHttpsAttribute
whenHttpContext.Request.IsLocal == false
.источник
После исследования aroud я смог решить эту проблему с помощью IIS Express и переопределения метода OnAuthorization класса Controller (Ссылка № 1). Я также пошел по маршруту, рекомендованному Хансельманом (ссылка №2). Однако я не был полностью удовлетворен этими двумя решениями по двум причинам: 1. OnAuthorization Ref # 1 работает только на уровне действия, а не на уровне класса контроллера 2. Ref # 2 требует большой настройки (Win7 SDK для makecert ), команды netsh и, чтобы использовать порт 80 и порт 443, мне нужно запустить VS2010 от имени администратора, что я не одобряю.
Итак, я придумал это решение, которое фокусируется на простоте со следующими условиями:
Я хочу иметь возможность использовать атрибут RequireHttps на уровне класса или действия контроллера
Я хочу, чтобы MVC использовал HTTPS, когда присутствует атрибут RequireHttps, и использовал HTTP, если он отсутствует
Я не хочу запускать Visual Studio от имени администратора
Я хочу иметь возможность использовать любые порты HTTP и HTTPS, назначенные IIS Express (см. Примечание № 1)
Я могу повторно использовать самоподписанный сертификат SSL IIS Express, и мне все равно, если я увижу недопустимое приглашение SSL
Я хочу, чтобы разработчики, тестовые и продакшн имели одну и ту же базу кода и один и тот же двоичный файл и были максимально независимы от дополнительных настроек (например, с использованием оснастки для сертификатов netsh, mmc и т. Д.).
Теперь, когда предыстория и объяснения разошлись, я надеюсь, что этот код кому-то поможет и сэкономит время. По сути, создайте класс BaseController, который наследуется от Controller, и унаследуйте классы контроллера от этого базового класса. Поскольку вы дочитали до этого места, я предполагаю, что вы знаете, как это делать. Итак, удачного кодирования!
Примечание №1: это достигается за счет использования полезной функции getConfig (см. Код)
Ссылка № 1: http://puredotnetcoder.blogspot.com/2011/09/requirehttps-attribute-in-mvc3.html
Ссылка № 2: http://www.hanselman.com/blog/WorkingWithSSLAtDevelopmentTimeIsEasierWithIISExpress.aspx
========== Код в BaseController ===================
============== конечный код ================
В Web.Release.Config добавьте следующее, чтобы очистить HttpPort и HttpsPort (чтобы использовать значения по умолчанию 80 и 443).
источник
Одно решение, которое можно использовать как в производственной среде, так и на рабочей станции разработчика. Это зависит от вашего варианта из настроек приложения в web.config
Если вы не хотите использовать SSL, удалите ключ. Если вы используете стандартный порт SSL 443, то удалите значение или укажите 443.
Затем используйте настраиваемую реализацию RequireHttpsAttribute, которая позаботится о вашем состоянии. Фактически он является производным от RequireHttps и использует ту же реализацию базового метода, за исключением добавления условий.
Не забудьте украсить метод LogOn в AccountController
и что-то подобное в вашем LogOn View, чтобы разместить форму по https.
источник
Как упоминал Джоэл, вы можете изменить компиляцию с помощью
#if !DEBUG
директивы.Я только что узнал, что вы можете изменить значение символа DEBUG в элементе компиляции файла web.config. Надеюсь, это поможет.
источник
MVC 6 (ASP.NET Core 1.0):
Правильным решением было бы использовать env.IsProduction () или env.IsDevelopment (). Узнайте больше о причине в этом ответе о том, как требовать https только в производственной среде .
Краткий ответ ниже (см. Ссылку выше, чтобы узнать больше о дизайнерских решениях) для 2 разных стилей:
Startup.cs (фильтр регистрации):
BaseController.cs (стиль атрибута):
RequireHttpsInProductionAttribute : оба из вышеперечисленных используют настраиваемый атрибут, наследующий от RequireHttpsAttribute :
источник
Для меня это был самый чистый путь. В моем
App_Start\FilterConfig.cs
файле. Однако больше нельзя запускать сборки выпуска.В качестве альтернативы вы можете настроить его так, чтобы https требовался только тогда, когда открыта пользовательская страница ошибок.
источник
Пожалуйста, обратитесь к этому сообщению Рика Андерсона о RickAndMSFT в Azure и MVC Заполнение пробела в Azure
http://blogs.msdn.com/b/rickandy/archive/2011/04/22/better-faster-easier-ssl-testing-for-asp-net-mvc-amp-webforms.aspx
источник