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

広告

TFS のビルド時に NuGet パッケージを復元する

近年の .NET 開発では、追加のライブラリをインストールするために NuGet が利用されます。
NuGet からダウンロードしたライブラリは、ソリューションの下の packages フォルダーにキャッシュされます。

Web アプリケーション プロジェクトはとくに NuGet のライブラリを使うことが多く、
通常の手順で TFS にチェックインすると、通信に時間がかかったり、
ソリューションごとに大量のキャッシュをソース管理で保持しなければならなくなります。

これを避け、ビルド時に TFS 側で NuGet パッケージをダウンロードさせる方法を以下で紹介します。

 

■ ビルド時に TFS 側で NuGet パッケージをダウンロードさせるための手順

ソリューションを作成したら、Web アプリケーション プロジェクトを作成する前に
[ソリューション エクスプローラー] でソリューションを右クリックして、
[NuGet パッケージの復元の有効化] をクリックします。

image

すると、.nuget というソリューション フォルダーが作成されます。

image

[ASP.NET MVC 4 Web アプリケーション] を [空] で作成して、TFS にチェックインします。
packages フォルダーの中では、repositories.config だけがチェックインされます。

image

これで、ビルド時には TFS 側で NuGet パッケージがダウンロードされるようになります。

 

■ NuGet パッケージのキャッシュを TFS のソース管理から完全に除外するための手順

上記の手順でビルドは成功するようになりましたが、
[保留中の変更] で [検出済み: 追加 xx] と表示されています。
ここには、ローカルとサーバーの差分がリアルタイムで表示されます。

image

[検出済み: 追加 xx] と表示されている部分をクリックします。

[候補の変更の昇格] ダイアログが表示されるので、
任意のファイルを右クリックして、[フォルダー (…) で無視] をクリックします。

image

すると、チーム プロジェクトのルート フォルダーに .tfignore ファイルが作成されます。
このファイルでは、TFS のソース管理で無視するファイルやフォルダーを指定できます。

このファイルを開き、「packages」以降のパスを削除して保存します。

image

これで、NuGet パッケージのキャッシュが TFS のソース管理から完全に除外されました。

 

バージョン情報
Visual Studio 2012

参照
Windows Azure と Visual Studio Online で継続的インテグレーション (1)

カテゴリー: ALM. タグ: , . 2 Comments »