но есть ли способ применить это ко всему сайту? Из-за моего хоста (Discountasp.net) я не могу использовать настройку "RequireSSL IIS".
Я бы порекомендовал настраиваемый модуль перенаправления, так как он быстрее поймает и перенаправит в жизненном цикле mvc. Я бы сделал это иначе, чем в этой статье [alexwolfoughtts.com/], но он показывает некоторые возможности. christo8989 30.03.2016
Чтобы обновить этот ответ для 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.
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:
В качестве альтернативы мы могли бы создать "класс 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" для регистрации глобальных атрибутов.