当我们在控制器类上启用以下属性时,我看到来自生产服务器的重定向循环:
public class TestRedirectHttpsAttribute : RedirectHttpsAttribute
{
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (Convert.ToBoolean(ConfigurationManager.AppSettings["TestSecureEnabled"] ?? bool.FalseString))
{
base.OnAuthorization(filterContext);
}
}
}
public class RedirectHttpsAttribute : FilterAttribute, IAuthorizationFilter
{
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.HttpContext.Request.IsSecureConnection)
{
UriBuilder uriBuilder = new UriBuilder(filterContext.HttpContext.Request.Url);
uriBuilder.Scheme = "https";
uriBuilder.Port = -1; // Don't inject port
filterContext.Result = new RedirectResult(uriBuilder.ToString());
}
}
}
我知道这与问题类似 - Redirect loop with SSL action filter in ASP.NET MVC但是在二月被问到,我希望有人可能有更好的解决方案。链接中问题的解决方案是从控制器中的操作重定向,但如果我们要将所有操作重定向到HTTPS,我们必须确保在每个操作中都调用它,而不是将自定义FilterAttribute应用于控制器。
注意:此代码适用于使用虚拟SSL证书的开发环境。
我可能有错误的结局,应该完全做其他事情,如果是这样,请接受我的道歉。
答案 0 :(得分:1)
对于任何可能遇到同样问题的人。这是我们的负载均衡器处理SSL请求并使用端口80切换到我们的Web服务器的结果;这导致无法确定安全请求确实是安全的。