MVC RequireHttps весь сайт - PullRequest
       6

MVC RequireHttps весь сайт

61 голосов
/ 20 июля 2010

Я читал предыдущие посты об использовании атрибута RequireHttpsAttribute для защиты отдельных контроллеров:

ASP.NET MVC RequireHttps только в рабочей среде

, но есть ли способприменить это ко всему сайту?Из-за моего хоста (discountasp.net) я не могу использовать параметр «RequireSSL IIS».

Ответы [ 9 ]

118 голосов
/ 10 апреля 2013

Зарегистрируйте RequireHttpsAttribute как глобальный фильтр.

В global.asax:

protected void Application_Start()
{
    GlobalFilters.Filters.Add(new RequireHttpsAttribute());

    //... other stuff
}
22 голосов
/ 20 июля 2010

Я использовал 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>
18 голосов
/ 20 июля 2010

Вы всегда можете добавить проверку на уровне приложения в ваш 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);
   }
}
13 голосов
/ 25 октября 2014

Просто чтобы обновить этот ответ для MVC 3 и выше , используйте следующее в файле Filterconfig.cs в папке App_start

        filters.Add(new RequireHttpsAttribute());

Очевидно, что IIS ваших серверов будет настроен для использования действующего сертификата SSL, дешевые сертификаты можно приобрести здесь: https://www.namecheap.com/ Я думаю, что в последний раз, когда я покупал один, это было $ 9 за домен в год.

8 голосов
/ 15 апреля 2017

В вашем 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 на каждой странице.

4 голосов
/ 30 марта 2016

Это не использует 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.Я покажу вам в Интернете.

<system.webServer>
    <modules>
        <add name="ConfigModuleName" type="Your.Namespace.RedirectModule"/>
    </modules>
</system.webServer>
3 голосов
/ 07 июля 2016

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));
    });
}

Объяснение проектных решений:

  1. Используйте фильтр в Startup.cs для глобальной настройки (так как мы хотим, чтобы это применялось везде). Стартап должен отвечать за регистрацию и настройку всех глобальных правил. Если в вашей компании будет нанят новый разработчик, она ожидает найти глобальные настройки в Startup.cs.
  2. Использовать логику 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
}
0 голосов
/ 18 апреля 2016

В 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());            
}
0 голосов
/ 20 июля 2010

Вы можете использовать базовый класс для всех ваших контроллеров и украшать его атрибутом require ssl.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...