我想在用戶登錄時從安全(https)重定向到http。它重定向很好,但由於某種原因它保留了https。Asp.net從Https重定向到Http
Response.Redirect(RedirectPath)
RedirectPath
包含完全限定的URL,包括http。
例如RedirectPath = "http://www.mydomain.com"
,但它重定向到https://www.mydomain.com
我想在用戶登錄時從安全(https)重定向到http。它重定向很好,但由於某種原因它保留了https。Asp.net從Https重定向到Http
Response.Redirect(RedirectPath)
RedirectPath
包含完全限定的URL,包括http。
例如RedirectPath = "http://www.mydomain.com"
,但它重定向到https://www.mydomain.com
我通過運行重定向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;
}
}
}
您同樣可以從https訪問http通過該計劃設定爲UriSchemeHttp
如果IsSecureConnection
爲真。
我可以建議你看看帶有諸如Fiddler這樣的工具的請求,看看這些重定向來自哪裏,並確實確認RedirectPath
確實完全合格嗎?
您應該能夠確認證書是通過HTTPS發送的,然後您將被重定向到(使用302)HTTP。如果您被重定向到HTTPS,那麼很可能是您沒有設置完全限定域名。
另一種選擇是您確實重定向到HTTP頁面,但還有其他內容會強制用戶返回到HTTPS - 例如強制用戶使用HTTPS登錄的機制 - 這是每頁或每個目錄設置?在這種情況下,您會看到一個302到HTTP,然後是另一個302到HTTPS。
我遇到了同樣的問題,在我的情況下,它肯定會被負載平衡器重寫。我們使用CoyotePoint的均衡器。我剛剛閱讀了手冊中的以下內容:
在第7層HTTPS羣集中,客戶端使用 HTTPS連接連接到羣集IP。均衡器終止HTTPS連接,並使用HTTP協議與集羣中的服務器進行通信。 默認情況下,Equalizer會檢查http:// URL的服務器響應, 會將它們重寫爲https:// URL,以便這些URL在 客戶端上正常工作。例如,如果服務器使用Location:頭髮送HTTP重定向,則該URL很可能包含http:// 協議。均衡器會重寫此響應,以便URL使用 https://。
顯然,我可以禁用「無頭重寫」來糾正它。
這裏是我的2美分...
做一個簡單的屬性類是這樣的:
public class ForceSSL : System.Attribute{
public bool Enabled;
public ForceSSL(bool _enabled)
Enabled = _enabled; }
接下來,創建一個基類爲您的網頁(縣)繼承。基類中(來自@德魯伊上面的例子中大樓)覆蓋OnPreInit事件本身:
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(真)在頂部您希望通過SSL訪問的每個頁面。
免責聲明 - 我參與了這個項目
我會建議使用http://nuget.org/packages/SecurePages/它給你,以確保特定網頁或使用正則表達式來定義匹配的能力的發展。它還會強制所有頁面不匹配正則表達式或直接指定回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);
聽起來像別的原因造成這種重 - 方向到https?如果你確信你的重定向變量是完全限定的,那麼http就是這段代碼之外的東西。它是什麼版本的IIS?你有沒有任何Url在那裏重寫? – Mantorok
如何重寫規則,因此不要手動執行重定向(以編程方式),而是讓Web服務器執行此操作? – abatishchev
是的,我完全相信Code很好。我們有兩個負載均衡服務器用於安全網站。我們正在使用IIS7。它可以在本地和項目環境中正常工作,但它在測試環境中不起作用。 – salman