ASP.NET MVC RequireHttps только в производстве - PullRequest
121 голосов
/ 28 октября 2009

Я хочу использовать RequireHttpsAttribute , чтобы предотвратить отправку незащищенных HTTP-запросов в метод действия.

C #

[RequireHttps] //apply to all actions in controller
public class SomeController 
{
    [RequireHttps] //apply to this action only
    public ActionResult SomeAction()
    {
        ...
    }
}

VB

<RequireHttps()> _
Public Class SomeController

    <RequireHttps()> _
    Public Function SomeAction() As ActionResult
        ...
    End Function

End Class

К сожалению, ASP.NET Development Server не поддерживает HTTPS.

Как заставить приложение ASP.NET MVC использовать RequireHttps при публикации в производственной среде, но не при запуске на моей рабочей станции разработки на сервере разработки ASP.NET?

Ответы [ 15 ]

3 голосов
/ 28 октября 2009

Если вы можете получить и переопределить - сделайте это. Если вы не можете - MVC поставляется с источниками, просто возьмите источники и создайте свой собственный атрибут [ForceHttps], который проверяет IsLocal.

2 голосов
/ 03 ноября 2010

Как упоминал Джоэл, вы можете изменить компиляцию с помощью директивы #if !DEBUG.

Я только что узнал, что вы можете изменить значение символа DEBUG в элементе компиляции файла web.config. Надеюсь, это поможет.

1 голос
/ 04 ноября 2016

Это был самый чистый путь для меня. В моем App_Start\FilterConfig.cs файле. Хотя больше не могу запускать релизные сборки.

... 
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
        if (!Web.HttpContext.Current.IsDebuggingEnabled) {
            filters.Add(new RequireHttpsAttribute());   
        }
        ...
}

В качестве альтернативы, вы могли бы установить, чтобы он запрашивал https, только если ваша пользовательская страница ошибки включена.

... 
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
        if (Web.HttpContext.Current.IsCustomErrorEnabled) {
            filters.Add(new RequireHttpsAttribute());   
        }
        ...
}
1 голос
/ 07 июля 2016

MVC 6 (ASP.NET Core 1.0):

Правильным решением будет использование env.IsProduction () или env.IsDevelopment (). Подробнее о причине в этом ответе на о том, как требовать https только в производстве .

Сокращенный ответ ниже (см. Ссылку выше, чтобы узнать больше о проектных решениях) для 2 различных стилей:

  1. Startup.cs - фильтр регистра
  2. 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);
    }
}
0 голосов
/ 01 сентября 2014

Пожалуйста, обратитесь к этому сообщению Рика Андерсона о RickAndMSFT в Azure и MVC. Заполнение пробела в Azure

http://blogs.msdn.com/b/rickandy/archive/2011/04/22/better-faster-easier-ssl-testing-for-asp-net-mvc-amp-webforms.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...