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.