MVC RequireHttps весь сайт



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



ASP.NET MVC RequireHttps только в производстве



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

525   9  

9 ответов:

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

в глобальном.асакс:

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

    //... other stuff
}

Я в конечном итоге с помощью IIS URL переписать 2.0 чтобы заставить сайт переключиться на HTTPS. Этот код в сети.конфиг делает трюк:

  <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>

вы всегда можете добавить проверку на уровне приложения в вашем глобальном.асакс

protected void Application_BeginRequest(Object sender, EventArgs e)
{
   if (!HttpContext.Current.Request.IsSecureConnection)
   {
    Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"]
                                 + HttpContext.Current.Request.RawUrl);
   }
}

просто чтобы довести этот ответ до даты MVC 3 и выше использовать следующий Filterconfig.cs

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

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

<system.webServer>
    <modules>
        <add name="ConfigModuleName" type="Your.Namespace.RedirectModule"/>
    </modules>
</system.webServer>

MVC 6 (ASP.NET Core 1.0) работает немного по-другому в своем способе регистрации фильтров:

Автозагрузка.cs-AddMvc с фильтром для RequireHttpsAttribute:

public void ConfigureServices(IServiceCollection services)
{
    // TODO: Register other services

    services.AddMvc(options =>
    {
        options.Filters.Add(typeof(RequireHttpsAttribute));
    });
}

дизайнерские решения, пояснил:

  1. использовать фильтр при запуске.cs глобальные настройки (так как мы хотим, чтобы это применяется везде). Стартап должен отвечать за регистрацию и настройку всех глобальных правил. Если в вашей компании работает новый разработчик, она было бы ожидать, чтобы найти глобальные настройки в автозагрузку.цезий.
  2. Используйте RequireHttpsAttribute логика, так как это доказано (Microsoft). Никогда не используйте "магические" строки, такие как "http://" и "https://", когда этого можно избежать, повторно используя компонент Microsoft, созданный для обеспечения той же логики.

Если вы используете свой сайт MVC в localhost без SSL:

  • http: / / localhost:1337/ (нет SSL)
  • https: / / localhost: 1337 / (SSL)

на как работать без SSL в localhost, все еще требуя https в производстве.

Примечание:

Как альтернатива, мы могли бы сделать " класс BaseController : Controller "и сделать все наши контроллеры наследуют от" BaseController " (вместо контроллера). Тогда нам нужно только установить атрибут 1 глобальный место (и не нужно регистрировать фильтр при запуске.цезий.)

некоторые люди предпочитают атрибутом стиля.

пример использования:

[RequireHttpsAttribute]
public class BaseController : Controller
{
    // Maybe you have other shared controller logic..
}

public class HomeController : BaseController
{
    // Add endpoints (GET / POST) for Home controller
}

В Глобальном.асакс.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());            
}

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

Comments

    Ничего не найдено.