13

ASP.NET MVCに関する多くの質問を読みましたが[RequireHttps]、この質問に対する答えが見つかりません。

[RequireHttps]そもそもhttpsではなかった場合、属性でURLをhttpsに切り替えるにはどうすればよいですか?

私はこのコードを持っています:

public ActionResult DoSomething()
{
    return View("AnotherAction");
}

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

しかし、「要求されたリソースにはSSL経由でのみアクセスできます」というエラーが表示されます。

MVC先物プロジェクトにも同様の属性があります[RequireSsl(Redirect = true)]。しかし、それは今では時代遅れです... MVC 2で同等のものは何ですか?

誰かがURLhttp://example.com/home/dosomethingまたはURLhttp://example.com/home/anotheractionを入力すると、 URL http s://example.comに自動的にリダイレクトされる必要があります / home / anotheraction

編集これは一連のイベントです:

URL http://example.com/home/dosomethingは、別のWebサイトから呼び出されます。ユーザーをこのURLにリダイレクトします(response.redirectなどを使用)。

DoSomething()その後、戻りを試みAnotherAction()ますが、「要求されたリソースにはSSL経由でのみアクセスできます」というエラーメッセージが表示されて失敗します。

4

5 に答える 5

23

RequiresHttps属性は自動的ににリダイレクトしようとしますhttps://your-url。その属性を使用しているサイトでこの動作を確認し、Reflectorのコードも確認しました。

protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
    if (!string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
    {
        throw new InvalidOperationException(MvcResources.RequireHttpsAttribute_MustUseSsl);
    }
    string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
    filterContext.Result = new RedirectResult(url);
}

安全な接続を受け入れるようにサイトを設定しましたか?https://your-url直接参照しようとするとどうなりますか?

于 2011-03-27T05:21:03.457 に答える
15

[mvc 4]短い答え:

protected void Application_BeginRequest(Object source, EventArgs e)
{
  if (!Context.Request.IsSecureConnection)
  {
      Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
  }
}

より長い答え:
httpからhttpsに移動するには、最初のパケットの後にhttpsにリダイレクトを送信
できないため、Application_BeginRequestを使用してパケットをキャッチする必要があります
。Global.asaxから関数を追加すると、デフォルトが上書きされます。
コードは次のようになります。そのようなもの(クラスレベルのGlobal.asax):

protected void Application_BeginRequest(Object source, EventArgs e)
{
  if (!Context.Request.IsSecureConnection && 
      !Request.Url.Host.Contains("localhost") && 
      Request.Url.AbsolutePath.Contains("SGAccount/Login"))
  {
      Response.Redirect(Request.Url.AbsoluteUri.Replace("http://", "https://"));
  }
}

ブレークポイントを設定し、Request.Urlオブジェクトを調べてURL関連のニーズがないかどうかを確認することを強くお勧めします。
または、 request.urlabsoluteuriとoriginalstringについて混乱しているmsdnページにアクセスしますか?
だから私はあなたが例のためにdotnetperlsに行くことができますか。
この関数を使用すると、ローカルホストで開発し、コードをそのままデプロイできます。
ここで、httpsリダイレクトを作成するすべてのページについて、if条件で指定する必要があります。
httpsからhttpに移動するには、通常のResponse.Redirectを次のように使用できます。

if (Request.Url.Scheme.Contains("https"))
{
    Response.Redirect(string.Format("http://{0}", Request.Url.Authority), true);
}

これは、httpsを追加する前の元のコースを中断しないことで、ローカルホストで開発するときに同じコードでの作業もサポートすることに注意してください。

また、return url規則(まだ実装されていない場合)を実装することを検討することをお勧めします。その場合は、次のようにする必要があります。

if (Request.Url.Scheme.Contains("https"))
{
    Response.Redirect(string.Format("http://{0}{1}", Request.Url.Authority, returnUrl), true);
}

これにより、ログイン後に要求されたページにリダイレクトされます。

もちろん、ユーザーデータ、登録、ログインなどを表示するすべてのページを保護する必要があります。

于 2013-07-29T23:11:14.273 に答える
3

HttpHEADリクエストはリダイレクトされていないようです。エラーログを確認すると、このメッセージがたくさん表示され、グーグルがここに表示されますが、詳細を確認すると、いくつかの興味深い「機能」があります。

  • Request_method:HEAD
  • ユーザーエージェント:curl / 7.35.0

言い換えれば、失敗した試みのすべてが顧客に直面しているわけではありませんでした...

(@ arserbin3からのコメントに100%のクレジットがあり、それらがすべてHEADリクエストであることに気づきました)

于 2016-07-28T14:09:04.723 に答える
2

MVC4はリダイレクトします

しかし、あなたが期待する方法ではありません。

http://www.example.com:8080/alpha/bravo/charlie?q=quuxは、クライアントのブラウザをhttps://www.example.com/alpha/bravo/charlie?q=quux にリダイレクトします 。

ポート番号がないことに注意してください。

http://aspnetwebstack.codeplex.com/SourceControl/latest#test/System.Web.Mvc.Test/Test/RequireHttpsAttributeTest.cs コードテスト[ファクト]publicvoid OnAuthorizationRedirectsIfRequestIsNotSecureAndMethodIsGet()

これが望ましい動作であることを確認します。

PORTを含むカスタム属性を記述したい場合...コードは以下に基づいて作成できます。

http://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Web.Mvc/RequireHttpsAttribute.cs

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class RequireHttpsAttribute : FilterAttribute, IAuthorizationFilter
{
    public RequireHttpsAttribute()
        : this(permanent: false)
    {
    }

    /// <summary>
    /// Initializes a new instance of the <see cref="RequireHttpsAttribute"/> class.
    /// </summary>
    /// <param name="permanent">Whether the redirect to HTTPS should be a permanent redirect.</param>
    public RequireHttpsAttribute(bool permanent)
    {
        this.Permanent = permanent;
    }

    /// <summary>
    /// Gets a value indicating whether the redirect to HTTPS should be a permanent redirect.
    /// </summary>
    public bool Permanent { get; private set; }

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

        if (!filterContext.HttpContext.Request.IsSecureConnection)
        {
            HandleNonHttpsRequest(filterContext);
        }
    }

    protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
    {
        // only redirect for GET requests, otherwise the browser might not propagate the verb and request
        // body correctly.

        if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
        {
            throw new InvalidOperationException(MvcResources.RequireHttpsAttribute_MustUseSsl);
        }

        // redirect to HTTPS version of page
        string url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
        filterContext.Result = new RedirectResult(url, this.Permanent);
    }
}
于 2015-02-24T05:31:47.027 に答える
0

すでに与えられた答えを補足するために、これはHandleNonHttpsRequestのMVC5実装からのコードです

protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
    // only redirect for GET requests, otherwise the browser might not propagate the verb and request
    // body correctly.
    ...
}
于 2014-02-04T21:46:28.313 に答える