MVC RequireHttps весь сайт
Я читал предыдущие сообщения об использовании RequireHttpsAttribute для защиты отдельных контроллеров:
ASP.NET MVC RequireHttps только в производстве
но есть ли способ, чтобы применить это ко всему сайту? Из-за моего хозяина (discountasp.net) я не могу использовать параметр "RequireSSL IIS".
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); } }
в 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)); }); }дизайнерские решения, пояснил:
- использовать фильтр при запуске.cs глобальные настройки (так как мы хотим, чтобы это применяется везде). Стартап должен отвечать за регистрацию и настройку всех глобальных правил. Если в вашей компании работает новый разработчик, она было бы ожидать, чтобы найти глобальные настройки в автозагрузку.цезий.
- Используйте 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