我正在尝试在用户登录时从安全(https)重定向到http。它重定向很好,但由于某种原因它保持https。
Response.Redirect(RedirectPath)
RedirectPath
包含完全限定的网址,包括http。
例如RedirectPath = "http://www.mydomain.com"
但重定向到https://www.mydomain.com
答案 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://
显然,我可以禁用“无标题重写”来纠正它。