[asp.net-mvc] 프로덕션에서만 ASP.NET MVC RequireHttps

RequireHttpsAttribute 를 사용하고 싶습니다.보안되지 않은 HTTP 요청이 작업 메서드로 전송되지 않도록 .

씨#

[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 개발 서버는 HTTPS를 지원하지 않습니다.

ASP.NET MVC 응용 프로그램이 프로덕션 환경에 게시 될 때 RequireHttps를 사용하도록 만들 수 있지만 ASP.NET 개발 서버의 개발 워크 스테이션에서 실행할 때는 어떻게해야합니까?



답변

개발 워크 스테이션에서 릴리스 빌드를 실행하는 경우에는 도움이되지 않지만 조건부 컴파일이 작업을 수행 할 수 있습니다.

#if !DEBUG
[RequireHttps] //apply to all actions in controller
#endif
public class SomeController
{
    //... or ...
#if !DEBUG
    [RequireHttps] //apply to this action only
#endif
    public ActionResult SomeAction()
    {
    }

}

최신 정보

Visual Basic에서 특성은 기술적으로 적용되는 정의와 동일한 줄의 일부입니다. 조건부 컴파일 문을 한 줄에 넣을 수 없으므로 함수 선언을 두 번 작성해야합니다. 한 번은 속성을 포함하고 한 번은 포함하지 않습니다. 하지만 추악함에 신경 쓰지 않으면 작동합니다.

#If Not Debug Then
    <RequireHttps()> _
    Function SomeAction() As ActionResult
#Else
    Function SomeAction() As ActionResult
#End If
        ...
    End Function

업데이트 2

여러 사람들이 RequireHttpsAttribute예제를 제공하지 않고 파생되었다고 언급 했으므로 여기에 하나가 있습니다. 이 접근 방식이 조건부 컴파일 접근 방식보다 훨씬 깨끗할 것이라고 생각하며 귀하의 입장에서 선호하는 것입니다.

면책 조항 :이 코드를 조금이라도 테스트하지 않았으며 VB는 상당히 녹슬 었습니다. 내가 아는 것은 그것이 컴파일된다는 것입니다. 나는 spot, queen3, Lance Fisher의 제안을 바탕으로 썼다. 작동하지 않으면 최소한 일반적인 아이디어를 전달하고 시작점을 제공해야합니다.

Public Class RemoteRequireHttpsAttribute
    Inherits System.Web.Mvc.RequireHttpsAttribute

    Public Overrides Sub OnAuthorization(ByVal filterContext As  _
                                         System.Web.Mvc.AuthorizationContext)
        If IsNothing(filterContext) Then
            Throw New ArgumentNullException("filterContext")
        End If

        If Not IsNothing(filterContext.HttpContext) AndAlso _
            filterContext.HttpContext.Request.IsLocal Then
            Return
        End If

        MyBase.OnAuthorization(filterContext)
    End Sub

End Class

기본적으로 현재 요청이 로컬 인 경우 (즉, localhost를 통해 사이트에 액세스하는 경우) 기본 SSL 인증 코드를 실행하는 대신 새 속성이 종료됩니다. 다음과 같이 사용할 수 있습니다.

<RemoteRequireHttps()> _
Public Class SomeController

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

End Class

훨씬 더 깨끗해! 테스트되지 않은 코드가 실제로 작동한다면.


답변

누구든지 C # 버전이 필요한 경우 :

using System;
using System.Web.Mvc;

namespace My.Utils
{
    public class MyRequireHttpsAttribute : RequireHttpsAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null)
            {
                throw new ArgumentNullException("filterContext");
            }

            if (filterContext.HttpContext != null && filterContext.HttpContext.Request.IsLocal)
            {
                return;
            }

            base.OnAuthorization(filterContext);
        }
    }
}


답변

RequireHttps에서 파생하는 것은 좋은 접근 방식입니다.

문제를 완전히 해결하려면 자체 서명 된 인증서로 로컬 컴퓨터에서 IIS를 사용할 수도 있습니다. IIS는 기본 제공 웹 서버보다 빠르며 개발 환경이 프로덕션과 비슷하다는 이점이 있습니다.

Scott Hanselman은 VS2010 및 IIS Express로 로컬 HTTPS를 구현하는 몇 가지 방법에 대한 훌륭한 리소스를 보유하고 있습니다.


답변

MVC 필터 시스템과 Global.asax.cs를 활용하여이 작업을 수행 할 수 있다고 가정합니다.

    protected void Application_Start()
    {
      RegisterGlobalFilters(GlobalFilters.Filters);
    }

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
      filters.Add(new HandleErrorAttribute());
      if(Config.IsProduction) //Some flag that you can tell if you are in your production environment.
      {
        filters.Add(new RequireHttpsAttribute());
      }
    }


답변

처음에 문제를 일으킨 것은 ASP.Net Development Server 였기 때문에 Microsoft는 이제 Visual Studio (VS2010 SP1 이후)와 함께 제공되는 IIS Express를 보유하고 있다는 점에 주목할 가치가 있습니다. 이것은 개발 서버만큼 사용하기 쉽지만 SSL을 포함한 IIS 7.5의 전체 기능 세트를 지원하는 IIS의 축소 버전입니다.

Scott Hanselman은 IIS Express에서 SSL 작업 에 대한 자세한 게시물을 보유하고 있습니다.


답변

사용자 지정 특성에서 RequireHttps 특성을 상속하는 방법은 무엇입니까? 그런 다음 사용자 지정 특성 내에서 현재 요청의 IsLocal 속성을 확인하여 요청이 로컬 컴퓨터에서 오는지 확인합니다. 그렇다면 기본 기능을 적용하지 마십시오. 그렇지 않으면 기본 작업을 호출합니다.


답변

이것은 나를 위해 MVC 6 (ASP.NET Core 1.0) . 코드는 디버그가 개발 중인지 확인하고 그렇지 않은 경우 ssl이 필요하지 않습니다. 모든 편집은 Startup.cs에 있습니다.

더하다:

private IHostingEnvironment CurrentEnvironment { get; set; }

더하다:

public Startup(IHostingEnvironment env)
{
    CurrentEnvironment = env;
}

편집하다:

public void ConfigureServices(IServiceCollection services)
{
    // additional services...

    services.AddMvc(options =>
    {
        if (!CurrentEnvironment.IsDevelopment())
        {
            options.Filters.Add(typeof(RequireHttpsAttribute));
        }
    });
}