2012-04-12 10 views
2

SSL接続を使用するWebアプリケーションを構築しようとしています。だから私はいくつかの調査を行い、必要なものを達成するためにRequireHttpsAttributeクラスを使用できることを発見しました。私が使用すると、アプリケーションが実行されると310エラー(リダイレクトが多すぎる)になります。私は、httpからhttpsへの切り替えを扱うカスタムクラスを構築しました。しかし、それもエラーになります。 TEプロトコルスイッチ処理するMVC3、RequireHttpsとカスタムハンドラーの結果がHTTP 310

私のクラス:

Public Class RequireSSLAttribute 
    Inherits ActionFilterAttribute 

    Public Property IsRequired() As Boolean 

    Public Overrides Sub OnActionExecuting(filterContext As ActionExecutingContext) 
     If Me.IsRequired AndAlso filterContext.HttpContext.Request.Url.Scheme <> "https" Then 
      filterContext.HttpContext.Response.Redirect(filterContext.HttpContext.Request.Url.OriginalString.Replace("http:", "https:").Remove(filterContext.HttpContext.Request.Url.OriginalString.LastIndexOf(":") + 1), True) 
      filterContext.Result = New HttpUnauthorizedResult 
     End If 
    End Sub 

    Public Sub New() 
     IsRequired = True 
    End Sub 
End Class 

答えて

12

にそれを変更してみてくださいを私はあなたのホストが誰なのか知らないが、私はちょうどAppHarborに同様の問題に遭遇しました彼らの中でこれを発見しましたknowledge base

組み込みのRequireHttpsAttribute to eコントローラの動作が常にHTTPSを使用している場合は、リダイレクト ループが発生します。その理由は、SSLがロードバランサレベル で終了し、RequireHttpsがX-Forwarded-Protoヘッダーを認識しないため、 が要求がHTTPSを使用して行われたことを示すために使用されるためです。 このため、カスタムRequireHttps属性を使用する必要があります。

は、彼らはまた、私は便宜上の下にコピーしますGithubに here、上の例のソリューションを提供している:私はこれで問題が解決するかどうかはわからない

using System; 
using System.Web.Mvc; 
using RequireHttpsAttributeBase = System.Web.Mvc.RequireHttpsAttribute; 

namespace AppHarbor.Web 
{ 
    [AttributeUsage(
     AttributeTargets.Class | AttributeTargets.Method, 
     Inherited = true, 
     AllowMultiple = false)] 
    public class RequireHttpsAttribute : RequireHttpsAttributeBase 
    { 
     public override void OnAuthorization(AuthorizationContext filterContext) 
     { 
      if (filterContext == null) 
      { 
       throw new ArgumentNullException("filterContext"); 
      } 

      if (filterContext.HttpContext.Request.IsSecureConnection) 
      { 
       return; 
      } 

      if (string.Equals(filterContext.HttpContext.Request.Headers["X-Forwarded-Proto"], 
       "https", 
       StringComparison.InvariantCultureIgnoreCase)) 
      { 
       return; 
      } 

      if (filterContext.HttpContext.Request.IsLocal) 
      { 
       return; 
      } 

      HandleNonHttpsRequest(filterContext); 
     } 
    } 
} 

。しかし、たとえあなたがAppHarborを使用していなくても、根本的な原因はあなたにとって同じかもしれません。その場合、上記のことは価値があると思われます。

+1

投稿していただきありがとうございます。これは、Amazon Elastic Beanstalkで機能しました。 –

+0

これらの3つの問題の順序はありますか? if(filterContext.HttpContext.Request.IsSecureConnection)if(string.Equals(filterContext.HttpContext.Request.Headers ["X-Forwarded-Proto"]、 "https"、StringComparison.InvariantCultureIgnoreCase)) HttpContext.Request.IsLocal)。そしてなぜif(filterContext.HttpContext.Request.IsSecureConnection)とif(filterContext.HttpContext.Request.IsLocal)を持つ必要があるのですか? – PussInBoots

0

If Me.IsRequired AndAlso filterContext.HttpContext.Request.Url.Scheme <> "https" Then 
    secureUrl = filterContext.HttpContext.Request.Url.OriginalString.Replace("http:", "https:").Remove(filterContext.HttpContext.Request.Url.OriginalString.LastIndexOf(":") + 1) 
    filterContext.Result = new RedirectResult(secureUrl) 
End If 
+0

それはうまく動作しませんが、私はその実際のリダイレクトとは思っていません。しかし、httpsでアクセスするとIf ... then節を過ぎてはいけません。 – Feanaro

+0

まだ無限のリダイレクトを行っていますか?また、AuthorizationFiltersも持っていますか? –

+0

最初のコントローラーであるログインコントローラーについては、私は認可フィルターを持っていません。ただし、ログインの背後にあるコントローラはこれらのフィルタを使用します。しかし、ログオンする前にそれにアクセスすることはできません、少なくとも私は願っています。 – Feanaro

関連する問題