MVC 6 (ASP.NET Core 1.0):
Правильным решением будет использование env.IsProduction () или env.IsDevelopment ().
Пример:
Startup.cs - AddMvc с пользовательским фильтром:
public void ConfigureServices(IServiceCollection services)
{
// TODO: Register other services
services.AddMvc(options =>
{
options.Filters.Add(typeof(RequireHttpsInProductionAttribute));
});
}
Пользовательский фильтр наследуется от RequireHttpsAttribute
public class RequireHttpsInProductionAttribute : RequireHttpsAttribute
{
private bool IsProduction { get; }
public RequireHttpsInProductionAttribute(IHostingEnvironment environment)
{
if (environment == null)
throw new ArgumentNullException(nameof(environment));
this.IsProduction = environment.IsProduction();
}
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (this.IsProduction)
base.OnAuthorization(filterContext);
}
protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
if(this.IsProduction)
base.HandleNonHttpsRequest(filterContext);
}
}
Объяснение проектных решений:
- Использовать среду IsProduction () или IsDevelopment (), например, "#if DEBUG".Иногда мы выпускаем / публикуем в режиме отладки на нашем тестовом сервере и не хотим отключать это требование безопасности.Это нужно отключить только в localhost / development (так как нам лень настраивать localhost SSL в IIS Express или что-то, что мы используем локально).
- Использовать фильтр в Startup.cs для глобальногоустановка (так как мы хотим, чтобы это применялось везде).Стартап должен отвечать за регистрацию и настройку всех глобальных правил.Если в вашей компании будет работать новый разработчик, она ожидает найти глобальные настройки в файле Startup.cs.
- Использовать RequireHttpsAttribute логику, поскольку она доказана (Microsoft).Единственное, что мы хотим изменить - это когда применяется логика (производство), а когда нет (разработка / локальный хост).Никогда не используйте «волшебные» строки, такие как «http://"» и «https://", если этого можно избежать, повторно используя компонент Microsoft, созданный для обеспечения той же логики.
Выше я бы назвал« правильным »решение.
Примечание:
В качестве альтернативы , мы могли бы создать «класс BaseController: Controller» и заставить все наши контроллеры наследовать от «BaseController "(вместо контроллера).Тогда нам нужно только установить глобальное место атрибута 1 (и не нужно регистрировать фильтр в Startup.cs).
Некоторые люди предпочитают стиль атрибута.Обратите внимание, что это исключит преимущества проектного решения № 2.
Пример использования:
[RequireHttpsInProductionAttribute]
public class BaseController : Controller
{
// Maybe you have other shared controller logic..
}
public class HomeController : BaseController
{
// Add endpoints (GET / POST) for Home controller
}