Asp.net从Https重定向到Http

时间:2011-07-04 09:35:01

标签: asp.net url redirect

我正在尝试在用户登录时从安全(https)重定向到http。它重定向很好,但由于某种原因它保持https。

 Response.Redirect(RedirectPath)

RedirectPath包含完全限定的网址,包括http。

例如RedirectPath = "http://www.mydomain.com"

但重定向到https://www.mydomain.com

5 个答案:

答案 0 :(得分:5)

我通过在Page_Load上运行以下内容来重定向:

protected void Page_Load(object sender, EventArgs e)
{
    if (!IsPostBack)
    {
        if (!Request.IsLocal && !Request.IsSecureConnection)
        {
            var ub = new UriBuilder(Request.Url);
            ub.Scheme = Uri.UriSchemeHttps;
            ub.Port = -1; // use default port for scheme
            Response.Redirect(ub.Uri.ToString(), true);
            return;
        }
    }
}

如果UriSchemeHttp为真,您可以通过将方案设置为IsSecureConnection来同样从https转到http。

答案 1 :(得分:2)

这是我的2美分......

制作一个像这样的简单属性类:

public class ForceSSL : System.Attribute{

public bool Enabled;

public ForceSSL(bool _enabled)
    Enabled = _enabled; }

接下来,为要继承的页面创建一个基类。在基类内部覆盖OnPreInit事件(从上面的示例@ Druid构建):

    protected override void OnPreInit(EventArgs e)
{
    if (!Request.IsSecureConnection)
    {
        var _sslAttr = this.GetType().GetCustomAttributes(true).Where(at => (at as ForceSSL) != null).FirstOrDefault();
        if (_sslAttr != null)
        {
            if ((_sslAttr as ForceSSL).Enabled)
            {
                var ub = new UriBuilder(Request.Url);
                ub.Scheme = Uri.UriSchemeHttps;
                ub.Port = -1;
                Response.Redirect(ub.Uri.ToString(), true);
                return;
            }
        }
    }
    base.OnPreInit(e);
}

现在只需将您的页面从您的基类继承,并将属性[ForceSSL(true)]放在您要通过SSL访问的每个页面的顶部。

答案 2 :(得分:1)

我是否可以建议您使用Fiddler等工具查看请求,以查看这些重定向的来源,并确实确认RedirectPath确实完全合格?< / p>

您应该能够确认通过HTTPS发送凭据,然后将您重定向(使用302)到HTTP。如果您被重定向到HTTPS,那么您可能没有设置完全限定的域。

另一种选择是您确实重定向到HTTP页面,但是还有其他东西会强制用户返回到HTTPS - 例如强制用户登录HTTPS以进行登录的机制 - 这是每页还是每个目录设置?在这种情况下,您会看到302到HTTP,然后是302到HTTPS。

答案 3 :(得分:1)

免责声明 - 我参与了这个项目的开发

我建议使用http://nuget.org/packages/SecurePages/它使您能够保护特定页面或使用Regex来定义匹配。它还会强制所有与Regex不匹配或直接指定的页面返回HTTP。

您可以通过NuGet安装它:Install-Package SecurePages

文档在这里:https://github.com/webadvanced/Secure-Page-manager-for-asp.net#secure-pages

简单用法:

SecurePagesConfiguration.Urls.AddUrl("/cart");

SecurePagesConfiguration.Urls.AddRegex(@"(.*)account", RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.Singleline);

答案 4 :(得分:0)

我遇到了同样的问题,在我的情况下,它肯定会被负载均衡器重写。我们正在使用CoyotePoint的均衡器。我刚刚阅读了手册中的以下内容:

  

在第7层HTTPS群集中,客户端使用连接到群集IP   HTTPS连接。均衡器终止HTTPS连接   使用HTTP协议与集群中的服务器通信。   默认情况下,Equalizer会检查http:// URL和的服务器响应   将它们重写为https:// URL,以便这些URL正常工作   客户端。例如,如果服务器使用该服务器发送HTTP重定向   位置:标题,此URL最有可能包含http://   协议。均衡器会重写此响应,以便URL使用   HTTPS://

显然,我可以禁用“无标题重写”来纠正它。