web-dev-qa-db-ja.com

MVC RequireHttpsサイト全体

RequireHttpsAttributeを使用して個々のコントローラーを保護することに関する以前の投稿を読みました。

ASP.NET MVC RequireHttps in Production Only

しかし、これをサイト全体に適用する方法はありますか?私のホスト(discountasp.net)のため、「RequireSSL IIS」設定を使用できません。

62
CodeGrue

最終的に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>
22
CodeGrue

RequireHttpsAttributeをグローバルフィルターとして登録します。

Global.asaxの場合:

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

    //... other stuff
}
120
hwiechers

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);
   }
}
19
Todd Smith

この答えをMVC 3以降に最新のものにするために、Filterconfig.csApp_startフォルダー内のファイル

        filters.Add(new RequireHttpsAttribute());

明らかにあなたのサーバーが必要になりますIIS有効なSSL証明書を使用するように設定されています。安い証明書はここで購入できます: https://www.namecheap.com/ 前回購入したときは、ドメインあたり年間9ドルでした。

14
Alex Stephens

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を使用するようになります。

10
joegreentea

これは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>
4
christo8989

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));
    });
}

設計決定の説明:

  1. グローバル設定にStartup.csでフィルターを使用します(これをどこにでも適用したいため)。スタートアップは、すべてのグローバルルールの登録と設定を担当する必要があります。あなたの会社が新しい開発者を雇用している場合、彼女はStartup.csでグローバルなセットアップを見つけることを期待します。
  2. (Microsoftによって)証明されているため、RequireHttpsAttributeロジックを使用します。同じロジックを提供するために作成されたMicrosoftコンポーネントを再利用することで回避できる場合は、「http://」や「https://」などの「魔法の」文字列を使用しないでください。

SSLを使用せずにlocalhostでMVC Webサイトを実行している場合:

  • http:// localhost:1337 /(SSLなし)
  • https:// localhost:1337 /(SSL)

プロダクションで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
}
3
Nick Niebling

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());            
}
0
Dhanuka777