MVC RequireHttps весь сайт
Я прочитал предыдущие сообщения об использовании RequireHttpsAttribute для защиты отдельных контроллеров:
ASP.NET MVC RequireHttps только в производстве
но есть ли способ применить это ко всему сайту? Из-за моего хоста (discountasp.net) я не могу использовать параметр "RequireSSL IIS".
Ответы
Ответ 1
В результате я использовал IIS URL Rewrite 2.0, чтобы заставить сайт перейти на HTTPS. Этот код в web.config делает трюк:
<system.webServer>
<!-- This uses URL Rewrite 2.0 to force the entire site into SSL mode -->
<rewrite xdt:Transform="Insert">
<rules>
<rule name="Force HTTPS" enabled="true">
<match url="(.*)" ignoreCase="false" />
<conditions>
<add input="{HTTPS}" pattern="off" />
</conditions>
<action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
</rule>
</rules>
</rewrite>
</system.webServer>
Ответ 2
Зарегистрируйте RequireHttpsAttribute
как глобальный фильтр.
В global.asax:
protected void Application_Start()
{
GlobalFilters.Filters.Add(new RequireHttpsAttribute());
//... other stuff
}
Ответ 3
Вы всегда можете добавить проверку на уровне приложения в свой global.asax
protected void Application_BeginRequest(Object sender, EventArgs e)
{
if (!HttpContext.Current.Request.IsSecureConnection)
{
Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"]
+ HttpContext.Current.Request.RawUrl);
}
}
Ответ 4
Чтобы довести этот ответ до даты MVC 3 и выше, используйте следующее в файле Filterconfig.cs в папке App_start/p >
filters.Add(new RequireHttpsAttribute());
Очевидно, что вам понадобятся серверы IIS, настроенные для использования действительного SSL-сертификата, дешевые сертификаты можно приобрести здесь: https://www.namecheap.com/ Я думаю, что в последний раз, когда я купил один, он составлял 9 долларов США за домен в год.
Ответ 5
Это не используется RequireHttps
, но я думаю, что это лучшее решение, потому что оно быстрее перехватывает перенаправление в MVC Lifecycle.
public class RedirectModule : IHttpModule
{
private HttpApplication _context;
public void Init(HttpApplication context)
{
_context = context;
_context.PostResolveRequestCache += HttpRedirect;
}
public void HttpRedirect(Object src, EventArgs args)
{
if (_context.Request.Url.Scheme == Uri.UriSchemeHttp)
{
//Redirect to https
var scheme = Uri.UriSchemeHttps + "://";
var authority = _context.Request.Url.Authority;
var url = _context.Request.RawUrl;
var redirectTo = scheme + authority + url;
_context.Response.PermanentRedirect(redirectTo);
}
}
public void Dispose() { }
}
Идея исходила из этой статьи .
Вы можете зарегистрировать модуль в Web.config
или внутри Global.asax
. Я покажу вам в web.cofig.
<system.webServer>
<modules>
<add name="ConfigModuleName" type="Your.Namespace.RedirectModule"/>
</modules>
</system.webServer>
Ответ 6
В свой FilterConfig.cs примените это:
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
// only if Debug is not enabled, do not require https for local development
if (!HttpContext.Current.IsDebuggingEnabled)
filters.Add(new RequireHttpsAttribute());
//... any other filters
}
Это должно заставить ваше приложение использовать https на каждой странице.
Ответ 7
MVC 6 (ASP.NET Core 1.0) немного отличается от способа регистрации фильтров:
Startup.cs - AddMvc с фильтром для RequireHttpsAttribute:
public void ConfigureServices(IServiceCollection services)
{
// TODO: Register other services
services.AddMvc(options =>
{
options.Filters.Add(typeof(RequireHttpsAttribute));
});
}
Обсуждаются конструкторские решения:
- Использовать фильтр в Startup.cs для глобальной настройки (поскольку мы хотим, чтобы это применимо повсюду). Запуск должен отвечать за регистрацию и настройку всех глобальных правил. Если в вашей компании будет работать новый разработчик, она рассчитывает найти глобальную настройку в Startup.cs.
- Использовать логику RequireHttpsAttribute, поскольку она доказана (Microsoft). Никогда не используйте "магические" строки, такие как "http://" и "https://", когда этого можно избежать, повторно используя компонент Microsoft, созданный для обеспечения той же логики.
Если вы используете свой веб-сайт MVC в локальном хостинге без SSL:
- http://localhost: 1337/(без SSL)
- https://localhost: 1337/(SSL)
Рассмотрите возможность запускать без SSL в локальном хосте, требуя при этом https файл.
Примечание:
Как альтернатива , мы можем создать "класс BaseController: Controller" и сделать все наши контроллеры наследуемыми от "BaseController" (вместо Controller). Тогда нам нужно только установить атрибут 1 глобальное место (и не нужно регистрировать фильтр в Startup.cs).
Некоторые люди предпочитают стиль атрибута.
Пример использования:
[RequireHttpsAttribute]
public class BaseController : Controller
{
// Maybe you have other shared controller logic..
}
public class HomeController : BaseController
{
// Add endpoints (GET / POST) for Home controller
}
Ответ 8
В Global.asax.cs используйте "RegisterGlobalFilters" для регистрации глобальных атрибутов.
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new RequireHttpsAttribute());
//e.g. filters.Add(new HandleErrorAttribute());
//e.g. filters.Add(new System.Web.Mvc.AuthorizeAttribute());
}
Ответ 9
Вы можете использовать базовый класс для всех своих контроллеров и украсить его с помощью атрибута ssl.