Windows Azure Web サイトで SSL を強制する

(追記: この投稿の強化版として、静的コンテンツにも SSL を強制するという投稿を追加しました。)

HTTPS および SSL による Windows Azure Web サイト (WAWS) のセキュリティ保護で説明されている通り、
Windows Azure Web サイトでは、ドメインを azurewebsites.net から変更しなければ最初から SSL を利用できます。
つまり、Web サイトを作成した時点で HTTP、HTTPS プロトコルの両方が有効になっています。

以下では、Windows Azure Web サイトに ASP.NET MVC アプリケーションを配置する場合に、
HTTPS プロトコルでの通信を強制する方法を考えていきます。

これを実現するには、HTTP でアクセスされた場合はプロトコルを HTTPS に変更してリダイレクトさせます。
永続的にリダイレクトさせる場合はステータス コード 301 (Moved Permanently) を、
一時的にリダイレクトさせる場合はステータス コード 302 (Found) または 307 (Temporary Redirect) を返します。

ASP.NET MVC で横断的に処理を挟み込むには、カスタム フィルター属性を利用します。
ASP.NET MVC には RequireHttpsAttribute クラスが用意されており、
これを使えばリダイレクトさせることはできるのですが、ステータス コードは 302 が固定で使われます。

そこで 301 も使えるようにするため、FilterAttribute クラスを継承して、次のような属性クラスを作成します。
RequireHttpsAttribute クラスと同様に、IAuthorizationFilter インターフェイスを実装します。

RequireHttps2Attribute.cs


using System;
using System.Text.RegularExpressions;
using System.Web;
using System.Web.Mvc;

namespace SslRedirect
{
    public class RequireHttps2Attribute : FilterAttribute, IAuthorizationFilter
    {
        // true: 301, false: 302
        public bool IsPermanent { get; private set; }

        public RequireHttps2Attribute(bool isPermanent = false)
        {
            IsPermanent = isPermanent;
        }

        public void OnAuthorization(AuthorizationContext filterContext)
        {
            if (filterContext == null) throw new ArgumentNullException("filterContext");

            if (!filterContext.HttpContext.Request.IsSecureConnection)
            {
                var url = filterContext.HttpContext.Request.Url.AbsoluteUri;
                var secureUrl = Regex.Replace(url, @"^\w+(?=://)", Uri.UriSchemeHttps);

                filterContext.Result = new RedirectResult(secureUrl, IsPermanent);
            }
        }
    }
}


 

すべてのコントローラーに対してこのフィルターを有効にするには、FilterConfig.cs に設定を追加します。

App_Start\FilterConfig.cs


using System.Web;
using System.Web.Mvc;

namespace SslRedirect
{
    public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new RequireHttps2Attribute(true));
        }
    }
}


クラスまたはメソッドに属性を指定すれば、コントローラーまたはアクション単位でフィルターを有効にすることもできます。


[RequireHttps2(true)]
public ActionResult Index()
{
    return View();
}


 

さて、Windows Azure Web サイトにアプリケーションを配置して、HTTP でアクセスします。
すると、HTTPS の URL にリダイレクトされます。

Windows Azure Web サイト

 

また、Cookie が HTTPS のときだけ送信されるようにするには、Web.config で requireSSL の値を true に設定します。


<system.web>
  <httpCookies httpOnlyCookies="true" requireSSL="true" />
</system.web>


個別に指定するには、HttpCookie.Secure プロパティの値を明示的に true に設定します。


public ActionResult Index()
{
    Response.SetCookie(new HttpCookie("key1", "value1") { HttpOnly = true, Secure = true });

    return View();
}


 

この投稿の強化版: 静的コンテンツにも SSL を強制する

バージョン情報
.NET Framework 4.5
ASP.NET MVC 4

参照
HTTPS および SSL による Windows Azure Web サイト (WAWS) のセキュリティ保護
RequireHttpsAttribute クラス
Understanding ASP.NET MVC Filters and Attributes

コメント / トラックバック1件 to “Windows Azure Web サイトで SSL を強制する”

  1. 静的コンテンツにも SSL を強制する | Do Design Space Says:

    […] Windows Azure Web サイトで SSL を強制するというエントリを書きましたが、 この方法は ASP.NET MVC でハンドルされる […]


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。