[C#] web.config 파일을 사용하여 HTTPS를 강제 실행하는 방법

나는 이것에 대한 해결책을 찾으려고 Google과 StackOverflow를 검색했지만 모두 ASP.NET 등과 관련이있는 것 같습니다.

일반적으로 서버에서 Linux를 실행하지만이 클라이언트 하나에 IIS 7.5 (및 Plesk 10)가있는 Windows를 사용하고 있습니다. 이것이 IIS와 web.config 파일에 약간 익숙하지 않은 이유 입니다. 에서 .htaccess파일 당신은 프로토콜이 따라 HTTPS 및 리디렉션 여부를 감지하는 재 작성 조건을 사용할 수 있습니다. web.config 파일을 사용하거나 심지어 설치 한 ‘ URL Rewrite ‘모듈을 사용하여이를 달성 하는 간단한 방법 이 있습니까?

ASP.NET에 대한 경험없으므로 솔루션에 관련된 경우 구현 방법에 대한 명확한 단계를 포함하십시오.

PHP가 아닌 web.config 로이 작업을 수행하는 이유 는 사이트 내의 모든 자산에 HTTPS를 강제 적용하기 때문입니다.



답변

URL 재 작성 모듈, 바람직하게는 v2가 필요합니다 (v1이 설치되어 있지 않으므로 작동한다고 보장 할 수는 없지만).

다음은 그러한 web.config의 예입니다. 301 영구 리디렉션을 사용하여 모든 리소스에 대해 HTTPS를 강제 적용합니다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Redirect to https" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

PS
이 특정 솔루션은 URL 재 작성 모듈 만 사용하므로 ASP.NET/PHP 또는 다른 기술과는 아무런 관련이 없습니다. 요청이 코드가있는 지점에 도달하기 전에 초기 / 낮은 수준 중 하나로 처리됩니다. 처형된다.


답변

ASP.NET MVC를 사용하는 경우 RequireHttpsAttribute 를 사용하여 모든 응답을 HTTPS로 만들 수 있습니다.

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

사이트를 보호하기 위해 수행 할 수있는 다른 작업 :

  1. 위조 방지 토큰이 SSL / TLS를 사용하도록합니다.

    AntiForgeryConfig.RequireSsl = true;
  2. Web.config 파일을 변경하여 쿠키가 기본적으로 HTTPS를 요구하도록 요구 :

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
  3. NWebSec.Owin NuGet 패키지를 사용하고 다음 코드 줄을 추가하여 사이트 전체에서 엄격한 전송 보안 (HSTS)을 활성화하십시오. 아래에 사전로드 지시문을 추가하고 사이트를 HSTS 사전로드 사이트에 제출하십시오 . 여기여기에 더 많은 정보가 있습니다 . OWIN을 사용하지 않는 경우 NWebSec 사이트 에서 Web.config 메소드를 읽을 수 있습니다.

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
  4. NWebSec.Owin NuGet 패키지를 사용하고 사이트 전체에서 HPKP (Public Key Pinning)를 활성화하려면 다음 코드 줄을 추가하십시오. 여기여기에 더 많은 정보가 있습니다 .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHpkp(options => options
        .Sha256Pins(
            "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
            "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
        .MaxAge(days: 30));
  5. 사용 된 URL에 https 체계를 포함 시키십시오. 일부 브라우저에서 구성표를 모방하면 CSP (콘텐츠 보안 정책) HTTP 헤더 및 SRI (하위 리소스 무결성) 가 제대로 작동하지 않습니다. HTTPS에 대해 명시 적으로 작성하는 것이 좋습니다. 예 :

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
  6. 사용 ASP.NET MVC 상용구 에서이 모든 훨씬 더 내장 된 프로젝트를 생성하려면 Visual Studio 프로젝트 템플릿을. 당신은 또한에 코드를 볼 수 있습니다 GitHub의 .


답변

LazyOne의 답변을 보강하기 위해 여기에 주석이 달린 답변이 있습니다.

<rewrite>
  <rules>
     <clear />
     <rule name="Redirect all requests to https" stopProcessing="true">
       <match url="(.*)" />
         <conditions logicalGrouping="MatchAll">
           <add input="{HTTPS}" pattern="off" ignoreCase="true" />
         </conditions>
         <action
            type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}"
            redirectType="Permanent" appendQueryString="false" />
     </rule>
  </rules>
</rewrite>

이 서버에 이미 정의되어있는 다른 모든 규칙을 지우십시오. “모든 요청을 https로 리디렉션”이라는 새 규칙을 만듭니다. 이 규칙을 처리 한 후에는 더 이상 규칙을 처리하지 마십시오! 들어오는 모든 URL과 일치합니다. 그런 다음 다른 모든 조건이 충족되는지 확인하십시오. HTTPS가 꺼져 있습니다. 글쎄, 그것은 하나의 조건 일뿐입니다 (그러나 그것이 사실인지 확인하십시오). 그렇다면 301 Permanent 리디렉션을 다시 클라이언트로 보냅니다 http://www.foobar.com/whatever?else=the#url-contains. 쿼리 문자열은 쿼리 문자열을 복제하므로 쿼리 문자열을 추가하지 마십시오!

이것이 속성, 속성 및 일부 값의 의미입니다.

  • clear 는 그렇지 않으면 상속 할 수있는 모든 서버 규칙을 제거합니다.
  • 규칙규칙을 정의합니다.
    • 이름 규칙에 대한 임의의 (하지만 고유의) 이름을.
    • stop : IIS 요청 파이프 라인으로 요청을 즉시 전달할지 또는 추가 규칙을 먼저 처리 할지를 처리합니다.
  • 이 규칙을 실행할 때 일치합니다 .
    • URL 을 평가할 패턴을 url
  • 조건 이 규칙을 실행하는 경우에 대한 추가 조건; 조건은 처음 일치하는 경우에만 처리됩니다.
    • 모든 조건이 참 ( MatchAll) 이어야하는지 또는 조건 중 하나라도 참 ( ) 이어야하는지 여부를 논리 그룹화 합니다 MatchAny. AND vs OR과 유사합니다.
  • add 는 충족해야하는 조건을 추가 합니다.
    • 조건이 평가하고있는 입력을 입력 하고; 입력은 서버 변수 일 수 있습니다.
    • 입력을 평가할 표준을 패턴 화 합니다.
    • 대문자가 중요한지 여부를 무시하십시오 .
  • 조치는 무엇을해야하는 경우 match와는 conditions모두 해당.
    • 유형 은 일반적으로 redirect(클라이언트 측) 또는 rewrite(서버 측) 일 수 있습니다.
    • 이 규칙의 결과로 무엇을 만들지 url ; 이 경우 https://두 개의 서버 변수로 연결 하십시오.
    • redirect 사용할 HTTP 리디렉션을 입력하십시오. 이것은 301 Permanent입니다.
    • appendQueryString 결과의 끝에 쿼리 ​​문자열을 추가할지 여부 url; 이 경우 {REQUEST_URI}이미 포함되어 있기 때문에 false로 설정 합니다.

서버 변수는

  • {HTTPS}어느 하나 OFF또는 ON입니다.
  • {HTTP_HOST}입니다 www.mysite.com.
  • {REQUEST_URI} 나머지 URI를 포함합니다 (예 : /home?key=value
    • 브라우저는 #fragment(LazyOne의 주석 참조)를 처리합니다 .

참조 : https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference


답변

받아 들인 대답이 효과가 없었습니다. 나는이 블로그 의 단계를 따랐다 .

나에게 없어진 요점은 IIS 용 URL 다시 쓰기 도구를 다운로드하여 설치해야한다는 것입니다. 여기 에서 찾았습니다 . 결과는 다음과 같습니다.

<rewrite>
        <rules>
            <remove name="Http to Https" />
            <rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" />
                </conditions>
                <serverVariables />
                <action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" />
            </rule>
        </rules>
    </rewrite>


답변

.Net Core에서 https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl 의 지침을 따르십시오.

startup.cs에서 다음을 추가하십시오.

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });`enter code here`

Http를 Https로 리디렉션하려면 startup.cs에 다음을 추가하십시오.

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);


답변

우수한 NWebsec 라이브러리는 다음의 upgrade-insecure-requests태그를 사용하여 HTTP에서 HTTPS로 요청을 업그레이드 할 수 있습니다 Web.config.

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>


답변

내 환경에 URL 다시 쓰기를 설치할 수 없으므로 다른 경로를 찾았습니다.

이것을 web.config에 추가하면 오류 다시 쓰기가 추가되고 IIS 7.5에서 작동했습니다.

<system.webServer>
    <httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:\WebSites\yoursite\" >
    <remove statusCode="403" subStatusCode="4" />
    <error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" />
</httpErrors>

그런 다음 조언을 따르십시오 : https://www.sslshopper.com/iis7-redirect-http-to-https.html

리디렉션 (redirectToHttps.html)을 수행하는 html 파일을 만들었습니다.

<html>
<head><title>Redirecting...</title></head>
<script language="JavaScript">
function redirectHttpToHttps()
{
    var httpURL= window.location.hostname + window.location.pathname + window.location.search;
    var httpsURL= "https://" + httpURL;
    window.location = httpsURL;
}
redirectHttpToHttps();
</script>
<body>
</body>
</html>

한 곳에서 다른 곳의 모든 조각을 찾을 수 없으므로 누군가 가이 기능을 유용하게 사용하기를 바랍니다.