MVC3,RequireHttps和自定义的处理导致HTTP 310(MVC3, RequireHt

2019-09-16 12:25发布

我试图构建一个使用SSL连接的Web应用程序。 所以我做了一些研究,发现我可以使用RequireHttpsAttribute类来实现我所需要的。 的是,当我使用它时,应用程序的结果在310错误的执行(太多重定向)。 我甚至建立一个自定义的类来处理从http切换到https。 但是,这也导致错误。

我的类来处理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

Answer 1:

我不知道你的主机是谁,但我只是碰到了一个类似的问题AppHarbor并在他们发现了这个知识基础 :

如果您使用的是内置RequireHttpsAttribute确保控制器动作总是使用HTTPS,你会遇到一个重定向循环。 其原因是SSL是在负载平衡器级终止并且RequireHttps不能识别X - 转发,原头,使用它来指示该请求是使用HTTPS制成。 因此,你应该使用自定义RequireHttps用于此目的的属性。

他们还提供了Github上的示例解决方案在这里 ,我将复制下面为了方便:

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的根本原因可能是你的一样,在这种情况下,上面似乎值得一试。



Answer 2:

尝试将其更改为

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


文章来源: MVC3, RequireHttps and custom handler result in http 310