我试图构建一个使用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
我不知道你的主机是谁,但我只是碰到了一个类似的问题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的根本原因可能是你的一样,在这种情况下,上面似乎值得一试。
尝试将其更改为
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