2012-04-12 71 views
2

我試圖構建一個使用SSL連接的Web應用程序。所以我做了一些研究,發現我可以使用RequireHttpsAttribute類來實現我所需要的。事情是,當我使用它時,應用程序的執行會導致310錯誤(太多重定向)。我甚至建立了一個自定義類來處理從http到https的切換。但是這也會導致錯誤。MVC3,RequireHttps和自定義處理程序結果在http 310

我的類來處理TE協議開關:

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。 – 2013-08-04 11:18:17

+0

這三個問題的順序是否正確? (filterContext.HttpContext.Request.IsSecureConnection),if(string.Equals(filterContext.HttpContext.Request.Headers [「X-Forwarded-Proto」],「https」,StringComparison.InvariantCultureIgnoreCase)),if(filterContext。 HttpContext.Request.IsLocal)。爲什麼我需要if(filterContext.HttpContext.Request.IsSecureConnection)和if(filterContext.HttpContext.Request.IsLocal)呢? – PussInBoots 2015-05-30 15:30:21

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

它unfornately不工作,但我不認爲它的實際重定向。但是,當通過https訪問時,它不應該超過If ... then子句。 – Feanaro 2012-04-12 22:22:23

+0

它仍在進行無限重定向嗎?你也有任何AuthorizationFilters嗎? – 2012-04-13 00:28:12

+0

對於第一個控制器的登錄控制器,我沒有任何授權過濾器。但登錄後面的控制器使用這些過濾器。但是,在登錄之前,你至少不能達到它,至少我希望。 – Feanaro 2012-04-13 06:03:01