RequireHttpsAttributeを使用して個々のコントローラーを保護することに関する以前の投稿を読みました。
ASP.NET MVC RequireHttps in Production Only
しかし、これをサイト全体に適用する方法はありますか?私のホスト(discountasp.net)のため、「RequireSSL IIS」設定を使用できません。
最終的にIIS RL Rewrite 2.を使用して、サイトを強制的に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>
RequireHttpsAttribute
をグローバルフィルターとして登録します。
Global.asaxの場合:
protected void Application_Start()
{
GlobalFilters.Filters.Add(new RequireHttpsAttribute());
//... other stuff
}
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以降に最新のものにするために、Filterconfig.csApp_startフォルダー内のファイル
filters.Add(new RequireHttpsAttribute());
明らかにあなたのサーバーが必要になりますIIS有効なSSL証明書を使用するように設定されています。安い証明書はここで購入できます: 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 Lifecycle でより早くリダイレクトをキャッチするため、より良いソリューションだと思います。
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- RequireHttpsAttribute のフィルターを使用したAddMvc
public void ConfigureServices(IServiceCollection services)
{
// TODO: Register other services
services.AddMvc(options =>
{
options.Filters.Add(typeof(RequireHttpsAttribute));
});
}
設計決定の説明:
SSLを使用せずにlocalhostでMVC Webサイトを実行している場合:
プロダクションでhttpsを必要とする一方で、localhostでSSLなしで実行する方法 を検討することを検討してください。
注:
alternativeとして、「class BaseController:Controller」を作成し、すべてのコントローラーを「Controller」ではなく「BaseController」から継承させることができます。次に、属性1をグローバルな場所に設定するだけで済みます(Startup.csにフィルターを登録する必要はありません)。
属性スタイルを好む人もいます。
使用例:
[RequireHttpsAttribute]
public class BaseController : Controller
{
// Maybe you have other shared controller logic..
}
public class HomeController : BaseController
{
// Add endpoints (GET / POST) for Home controller
}
Global.asax.csで、「RegisterGlobalFilters」を使用してグローバル属性を登録します。
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());
}