Programing

MVC RequireHttps 전체 사이트

lottogame 2020. 11. 26. 07:45
반응형

MVC RequireHttps 전체 사이트


RequireHttpsAttribute를 사용하여 개별 컨트롤러를 보호하는 방법에 대한 이전 게시물을 읽었습니다.

프로덕션에서만 ASP.NET MVC RequireHttps

그러나 이것을 전체 사이트에 적용하는 방법이 있습니까? 내 호스트 (discountasp.net)로 인해 "RequireSSL IIS"설정을 사용할 수 없습니다.


RequireHttpsAttribute글로벌 필터로 등록하십시오 .

global.asax에서 :

protected void Application_Start()
{
    GlobalFilters.Filters.Add(new RequireHttpsAttribute());

    //... other stuff
}

IIS URL Rewrite 2.0 을 사용하여 사이트를 HTTPS로 강제 전환했습니다. web.config의이 코드는 트릭을 수행합니다.

  <system.webServer>
    <!-- This uses URL Rewrite 2.0 to force the entire site into SSL mode -->
    <rewrite xdt:Transform="Insert">
      <rules>
        <rule name="Force HTTPS" enabled="true">
          <match url="(.*)" ignoreCase="false" />
          <conditions>
            <add input="{HTTPS}" pattern="off" />
          </conditions>
          <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" appendQueryString="true" redirectType="Permanent" />
        </rule>
      </rules>
    </rewrite>
  </system.webServer>

global.asax의 응용 프로그램 수준에서 항상 검사를 추가 할 수 있습니다.

protected void Application_BeginRequest(Object sender, EventArgs e)
{
   if (!HttpContext.Current.Request.IsSecureConnection)
   {
    Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"]
                                 + HttpContext.Current.Request.RawUrl);
   }
}

MVC 3 이상에 대해이 답변을 최신 상태로 유지 하려면 App_start 폴더 Filterconfig.cs 파일에서 다음을 사용하십시오.

        filters.Add(new RequireHttpsAttribute());

분명히 유효한 SSL 인증서를 사용하도록 구성된 서버 IIS가 필요합니다. 저렴한 인증서는 여기에서 구입할 수 있습니다. https://www.namecheap.com/ 마지막으로 구입했을 때 도메인 당 연간 9 달러였습니다.


FilterConfig.cs에서 다음을 적용하십시오.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
     // only if Debug is not enabled, do not require https for local development
     if (!HttpContext.Current.IsDebuggingEnabled)
          filters.Add(new RequireHttpsAttribute());

     //... any other filters
}

그러면 앱이 모든 페이지에서 https를 사용해야합니다.


이것은 사용하지 RequireHttps않지만 MVC 수명주기 에서 리디렉션을 더 빨리 포착하기 때문에 더 나은 솔루션이라고 생각합니다 .

public class RedirectModule : IHttpModule
{
    private HttpApplication _context;

    public void Init(HttpApplication context)
    {
        _context = context;
        _context.PostResolveRequestCache += HttpRedirect;
    }

    public void HttpRedirect(Object src, EventArgs args)
    {
        if (_context.Request.Url.Scheme == Uri.UriSchemeHttp)
        {
            //Redirect to https
            var scheme = Uri.UriSchemeHttps + "://";
            var authority = _context.Request.Url.Authority;
            var url = _context.Request.RawUrl;

            var redirectTo = scheme + authority + url;
            _context.Response.PermanentRedirect(redirectTo);
        }
    }

    public void Dispose() { }
}

아이디어는이 기사 에서 나왔습니다 .

당신은 당신의 Web.config또는 내부에 모듈을 등록 할 수 있습니다 Global.asax. web.cofig에서 보여 드리겠습니다.

<system.webServer>
    <modules>
        <add name="ConfigModuleName" type="Your.Namespace.RedirectModule"/>
    </modules>
</system.webServer>

MVC 6 (ASP.NET Core 1.0)은 필터를 등록하는 방식에서 약간 다르게 작동합니다.

Startup.cs - AddMvc with filter for RequireHttpsAttribute:

public void ConfigureServices(IServiceCollection services)
{
    // TODO: Register other services

    services.AddMvc(options =>
    {
        options.Filters.Add(typeof(RequireHttpsAttribute));
    });
}

Design decisions explained:

  1. Use filter in Startup.cs for global setup (since we want this to apply everywhere). Startup should be responsible for registering and setting up all global rules. If your company employ a new developer, she would expect to find global setup in Startup.cs.
  2. Use RequireHttpsAttribute logic since it's proven (by Microsoft). Never use "magical" strings like "http://" and "https://" when it can be avoided by reusing a Microsoft component created to provide the same logic.

If you are running your MVC website in localhost without SSL:

  • http://localhost:1337/ (no SSL)
  • https://localhost:1337/ (SSL)

Consider looking at how to run without SSL in localhost while still requiring https it in production.

Note:

As an alternative, we could make a "class BaseController : Controller" and make all our controllers inherit from "BaseController" (instead of Controller). Then we only have to set the attribute 1 global place (and don't need to register filter in Startup.cs).

Some people prefer the attribute style.

Example of usage:

[RequireHttpsAttribute]
public class BaseController : Controller
{
    // Maybe you have other shared controller logic..
}

public class HomeController : BaseController
{
    // Add endpoints (GET / POST) for Home controller
}

In Global.asax.cs, use "RegisterGlobalFilters" to register global attributes.

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new RequireHttpsAttribute());
    //e.g. filters.Add(new HandleErrorAttribute());
    //e.g. filters.Add(new System.Web.Mvc.AuthorizeAttribute());            
}

You could use a base class for all of your controllers, and decorate that with the require ssl attribute.

참고URL : https://stackoverflow.com/questions/3285014/mvc-requirehttps-entire-site

반응형