81

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 でより良い/更新された方法はありますか?,

4

12 に答える 12

92

ASP.NET MVC 2 Preview 2 以降を使用している場合は、以下を簡単に使用できるようになりました。

[RequireHttps]
public ActionResult Login()
{
   return View();
}

ただし、 here で説明されているように、順序パラメーターは注目に値します。

于 2010-03-01T21:03:31.480 に答える
17

MVCFuturesには「RequireSSL」属性があります。

(更新されたブログ投稿でそれを指摘してくれたAdamに感謝します)

http://リクエストを自動的にhttps://にする場合は、「Redirect=true」を使用してアクションメソッドに適用するだけです。

    [RequireSsl(Redirect = true)]

参照:本番環境でのみASP.NET MVC RequireHttps

于 2009-07-12T20:01:03.657 に答える
9

Amadiereが書いたように、[RequireHttps] は MVC 2 でHTTPSに入るためにうまく機能します。しかし、あなたが言ったように、いくつかのページに HTTPS のみを使用したい場合、MVC 2 は愛を与えません.ユーザーを HTTPS に切り替えると、手動でリダイレクトするまでそこに留まります.

私が使用したアプローチは、別のカスタム属性 [ExitHttpsIfNotRequired] を使用することです。コントローラーまたはアクションにアタッチすると、次の場合に HTTP にリダイレクトされます。

  1. リクエストは HTTPS でした
  2. [RequireHttps] 属性がアクション (またはコントローラー) に適用されませんでした
  3. リクエストは GET でした (POST をリダイレクトすると、あらゆる種類の問題が発生します)。

ここに投稿するには少し大きすぎますが、ここにコードといくつかの追加の詳細が表示されます。

于 2010-03-25T05:38:38.923 に答える
8

これに関する Dan Wahlin の最近の投稿は次のとおりです。

http://weblogs.asp.net/dwahlin/archive/2009/08/25/requiring-ssl-for-asp-net-mvc-controllers.aspx

彼は ActionFilter 属性を使用します。

于 2009-08-25T20:20:32.993 に答える
3

属性指向の開発アプローチのファンではない人のために、ここに役立つコードがあります:

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つは、保護されたすべてのページのリストを確認する場合、ソリューション内のすべてのコントローラーをジャンプする必要があることです。

于 2012-07-19T23:24:30.893 に答える
3

一部の ActionLink 拡張機能: http://www.squaredroot.com/post/2008/06/11/MVC-and-SSL.aspxまたは、https:// http ://forums.asp.net にリダイレクトするコントローラー アクション属性/p/1260198/2358380.aspx#2358380

于 2008-10-01T10:10:14.510 に答える
1

これは、2009 年 1 月のPablo M. Cibrano によるブログ投稿で、HttpModule と拡張メソッドを含むいくつかの手法をまとめています。

于 2009-04-21T07:52:36.687 に答える
1

これは、ActionFilter を使用するAdam Salvoによるブログ投稿です。

于 2009-04-21T07:58:56.640 に答える
1

これは必ずしも MVC 固有のものではありませんが、このソリューションは ASP.NET WebForms と MVC の両方で機能します。

http://www.codeproject.com/KB/web-security/WebPageSecurity_v2.aspx

私はこれを数年間使用しており、web.config ファイルを介した関心と管理の分離が気に入っています。

于 2010-06-08T13:41:10.253 に答える
0

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 リクエストを除外する方法に関する同様の質問に対する私の回答を参照してください。

于 2016-07-07T12:44:18.840 に答える
0

または、フィルターをGlobal.asax.csに追加します。

GlobalFilters.Filters.Add(新しい RequireHttpsAttribute());

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);
        }
    }
}
于 2020-03-02T18:26:55.097 に答える