我正在尝试构建一个使用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
答案 0 :(得分:12)
我不知道你的主人是谁,但我在AppHarbor上遇到了类似的问题,并在knowledge base发现了这个问题:
如果您正在使用内置的RequireHttpsAttribute来确保a 控制器操作始终使用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 :(得分: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