Bezdepbonusu7Программирование: статьи и ответы

Вопрос

MVC RequireHttps весь сайт

Автор вопроса: CodeGrueОтветов: 9

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

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

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

  • Я бы порекомендовал настраиваемый модуль перенаправления, так как он быстрее поймает и перенаправит в жизненном цикле mvc. Я бы сделал это иначе, чем в этой статье [alexwolfoughtts.com/], но он показывает некоторые возможности. christo8989 30.03.2016

ssl

Ответы

Ответ 1 · рейтинг 131 · hwiechers

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

В global.asax:

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

    //... other stuff
}

Ответ 2 · рейтинг 24 · CodeGrue

В итоге я использовал 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>

Ответ 3 · рейтинг 20 · Todd Smith

Вы всегда можете добавить проверку на уровне приложения в свой 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 · рейтинг 17 · Alex Stephens

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

        filters.Add(new RequireHttpsAttribute());

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

Ответ 5 · рейтинг 14 · joegreentea

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

Ответ 6 · рейтинг 4 · christo8989

Здесь не используется RequireHttps, но я думаю, что это лучшее решение, потому что оно быстрее улавливает перенаправление в Жизненный цикл MVC.

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>

Ответ 7 · рейтинг 4 · Nick Niebling

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)

Рассмотрите возможность просмотра https://stackoverflow.com/a/38244992/1095493.

Примечание.

В качестве альтернативы мы могли бы создать "класс 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 · Dhanuka777

В 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 · рейтинг -2 · DanP

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы