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:
- 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.
- 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
'Programing' 카테고리의 다른 글
UITableView의 테두리를 제거하려면 어떻게합니까? (0) | 2020.11.26 |
---|---|
Windows에서 Mono의 요점은 무엇입니까? (0) | 2020.11.26 |
내 SDK 버전을 다운 그레이드하는 방법은 무엇입니까? (0) | 2020.11.26 |
JavaScript 객체의 값을 합하는 방법은 무엇입니까? (0) | 2020.11.26 |
TypeScript에서 문자열 유형의 배열 테스트 (0) | 2020.11.26 |