ASP.NET MVC ベースのサイトの一部のページで HTTPS を使用するにはどうすればよいですか?
Steve Sanderson は、Preview 4 で DRY の方法でこれを行う方法についての非常に優れたチュートリアルを次の場所で公開しています。
http://blog.codeville.net/2008/08/05/adding-httpsssl-support-to-aspnet-mvc-routing/
Preview 5 でより良い/更新された方法はありますか?,
ASP.NET MVC ベースのサイトの一部のページで HTTPS を使用するにはどうすればよいですか?
Steve Sanderson は、Preview 4 で DRY の方法でこれを行う方法についての非常に優れたチュートリアルを次の場所で公開しています。
http://blog.codeville.net/2008/08/05/adding-httpsssl-support-to-aspnet-mvc-routing/
Preview 5 でより良い/更新された方法はありますか?,
ASP.NET MVC 2 Preview 2 以降を使用している場合は、以下を簡単に使用できるようになりました。
[RequireHttps]
public ActionResult Login()
{
return View();
}
ただし、 here で説明されているように、順序パラメーターは注目に値します。
MVCFuturesには「RequireSSL」属性があります。
(更新されたブログ投稿でそれを指摘してくれたAdamに感謝します)
http://リクエストを自動的にhttps://にする場合は、「Redirect=true」を使用してアクションメソッドに適用するだけです。
[RequireSsl(Redirect = true)]
Amadiereが書いたように、[RequireHttps] は MVC 2 でHTTPSに入るためにうまく機能します。しかし、あなたが言ったように、いくつかのページに HTTPS のみを使用したい場合、MVC 2 は愛を与えません.ユーザーを HTTPS に切り替えると、手動でリダイレクトするまでそこに留まります.
私が使用したアプローチは、別のカスタム属性 [ExitHttpsIfNotRequired] を使用することです。コントローラーまたはアクションにアタッチすると、次の場合に HTTP にリダイレクトされます。
ここに投稿するには少し大きすぎますが、ここにコードといくつかの追加の詳細が表示されます。
これに関する Dan Wahlin の最近の投稿は次のとおりです。
http://weblogs.asp.net/dwahlin/archive/2009/08/25/requiring-ssl-for-asp-net-mvc-controllers.aspx
彼は ActionFilter 属性を使用します。
属性指向の開発アプローチのファンではない人のために、ここに役立つコードがあります:
public static readonly string[] SecurePages = new[] { "login", "join" };
protected void Application_AuthorizeRequest(object sender, EventArgs e)
{
var pageName = RequestHelper.GetPageNameOrDefault();
if (!HttpContext.Current.Request.IsSecureConnection
&& (HttpContext.Current.Request.IsAuthenticated || SecurePages.Contains(pageName)))
{
Response.Redirect("https://" + Request.ServerVariables["HTTP_HOST"] + HttpContext.Current.Request.RawUrl);
}
if (HttpContext.Current.Request.IsSecureConnection
&& !HttpContext.Current.Request.IsAuthenticated
&& !SecurePages.Contains(pageName))
{
Response.Redirect("http://" + Request.ServerVariables["HTTP_HOST"] + HttpContext.Current.Request.RawUrl);
}
}
属性を回避する理由はいくつかありますが、そのうちの1つは、保護されたすべてのページのリストを確認する場合、ソリューション内のすべてのコントローラーをジャンプする必要があることです。
一部の ActionLink 拡張機能: http://www.squaredroot.com/post/2008/06/11/MVC-and-SSL.aspxまたは、https:// http ://forums.asp.net にリダイレクトするコントローラー アクション属性/p/1260198/2358380.aspx#2358380
これは、2009 年 1 月のPablo M. Cibrano によるブログ投稿で、HttpModule と拡張メソッドを含むいくつかの手法をまとめています。
これは、ActionFilter を使用するAdam Salvoによるブログ投稿です。
これは必ずしも MVC 固有のものではありませんが、このソリューションは ASP.NET WebForms と MVC の両方で機能します。
http://www.codeproject.com/KB/web-security/WebPageSecurity_v2.aspx
私はこれを数年間使用しており、web.config ファイルを介した関心と管理の分離が気に入っています。
MVC 6 (ASP.NET Core 1.0) は、Startup.cs とは若干異なる動作をします。
すべてのページで RequireHttpsAttribute (Amadiere の回答で述べたように) を使用するには、各コントローラーで属性スタイルを使用する代わりに (または、すべてのコントローラーが継承する BaseController を作成する代わりに)、これを Startup.cs に追加できます。
Startup.cs - フィルターの登録:
public void ConfigureServices(IServiceCollection services)
{
// TODO: Register other services
services.AddMvc(options =>
{
options.Filters.Add(typeof(RequireHttpsAttribute));
});
}
上記のアプローチの設計上の決定の詳細については、 RequireHttpsAttribute による処理から localhost リクエストを除外する方法に関する同様の質問に対する私の回答を参照してください。
または、フィルターをGlobal.asax.csに追加します。
GlobalFilters.Filters.Add(新しい RequireHttpsAttribute());
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace xxxxxxxx
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
GlobalFilters.Filters.Add(new RequireHttpsAttribute());
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
}
}