MVC 6 (ASP.NET Core 1.0):
Правильным решением будет использование env.IsProduction () или env.IsDevelopment (). Подробнее о причине в этом ответе на о том, как требовать https только в производстве .
Сокращенный ответ ниже (см. Ссылку выше, чтобы узнать больше о проектных решениях) для 2 различных стилей:
- Startup.cs - фильтр регистра
- BaseController - стиль атрибута
Startup.cs (фильтр регистра):
public void ConfigureServices(IServiceCollection services)
{
// TODO: Register other services
services.AddMvc(options =>
{
options.Filters.Add(typeof(RequireHttpsInProductionAttribute));
});
}
BaseController.cs (стиль атрибута):
[RequireHttpsInProductionAttribute]
public class BaseController : Controller
{
// Maybe you have other shared controller logic..
}
public class HomeController : BaseController
{
// Add endpoints (GET / POST) for Home controller
}
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);
}
}