我尝试在我网站的选定网页上实施HTTPS。使用 RequireHttps 属性可以正常运行但会导致测试问题,因为我们没有在本地安装证书。
我正在寻找的解决方案需要忽略localhost并忽略一个测试服务器,同时在我们的第二个测试服务器上工作,我们确实有一个证书。
关于此的一些进一步背景。目的是逐渐将网站移至https。它是一个电子商务网站,所以显然部分已经是安全的,我知道由于许多原因,将整个网站移动到安全是一件好事。我也知道,一旦你从页面A移动到页面B,其中B是安全的,那么当你回到A时它不会回到HTTP,那很好。 我想分阶段移动网站,以防万一有不匹配的内容,网站地图,搜索引擎优化,谷歌排名等问题。
我尝试过的各种解决方案 - 我已经实现了一个派生自RequireHttps属性的类,如下所示:
public class CustomRequireHttps : RequireHttpsAttribute
{
protected override void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
if (filterContext.HttpContext.Request.Url != null && (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase)
&& !String.Equals(filterContext.HttpContext.Request.HttpMethod, "HEAD", StringComparison.OrdinalIgnoreCase)
&& !filterContext.HttpContext.Request.Url.Host.Contains("localhost")
&& !filterContext.HttpContext.Request.Url.Host.Contains("testing")))
{
base.HandleNonHttpsRequest(filterContext);
}
}
}
并且已将此属性应用于一个页面,但它没有按预期工作,它会将HTTPS应用于网站上的所有页面,或者根本不起作用。
我也尝试过这个解决方案,但只能在localhost上运行,而不能在两个测试服务器上运行:
#if !DEBUG
[RequireHttps]
#endif
然后我尝试重写OnAuthorizartion方法,如下所示:
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.HttpContext != null && filterContext.HttpContext.Request.IsLocal)
{
return;
}
base.OnAuthorization(filterContext);
}
它在本地工作但是一旦我将它带到测试证书的服务器上突然每个页面都是HTTPS,我不明白,因为我只在一个页面上使用了这个派生属性。
因此,我希望实现的目标是在我网站上选定数量的网页上实施HTTPS。需要在localhost和第一个测试服务器上忽略此HTTPS请求,但需要在具有证书的第二个测试服务器上忽略 NOT 。
到目前为止它要么根本不起作用,要么在网站的每个页面上都没有。
然而,这是踢球者,如果我使用RequireHttps属性,它在第二个测试服务器上运行良好,但在没有证书的情况下在所有服务器上都会出现问题。完美地运作'我的意思是它仅在我使用该属性的页面上实现HTTPS,并且不会突然将所有页面切换为安全页面。
我在这里做错了什么想法?
答案 0 :(得分:0)
可能会有很多事情发生,例如当您的链接是本地链接时,当切换到HTTPS时,所有页面都是HTTPS(不应用请求HTTPS不会切换回HTTP)。从安全角度来看,当您需要用于页面子集时,您应该使用HTTPS提供所有页面(否则,您可以通过未加密的HTTP共享安全cookie /登录令牌)。因此,可能会应用您的属性,并且所有后续请求都通过SSL提供。
其次,测试localhost请求uri将在第二台服务器上通过HTTP提供页面。我认为解决此问题的方法是在web.config中创建一个交换机,如果页面应该通过HTTPS提供。在全局filterConfig中检查此开关:
public static class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
var useSsl = Convert.ToBoolean(ConfigurationManager.AppSettings["useSsl"]);
if (useSsl )
{
filters.Add(new RequireHttpsAttribute());
}
}
}