2011-07-04 133 views
2

我想在用戶登錄時從安全(https)重定向到http。它重定向很好,但由於某種原因它保留了https。Asp.net從Https重定向到Http

Response.Redirect(RedirectPath) 

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

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

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

+0

聽起來像別的原因造成這種重 - 方向到https?如果你確信你的重定向變量是完全限定的,那麼http就是這段代碼之外的東西。它是什麼版本的IIS?你有沒有任何Url在那裏重寫? – Mantorok

+0

如何重寫規則,因此不要手動執行重定向(以編程方式),而是讓Web服務器執行此操作? – abatishchev

+0

是的,我完全相信Code很好。我們有兩個負載均衡服務器用於安全網站。我們正在使用IIS7。它可以在本地和項目環境中正常工作,但它在測試環境中不起作用。 – salman

回答

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; 
     } 
    } 
} 

您同樣可以從https訪問http通過該計劃設定爲UriSchemeHttp如果IsSecureConnection爲真。

+2

我打算爲此投票,因爲你剛剛向我介紹了UriBuilder類:-) – Mantorok

+0

不,它沒有幫助。但是我仍然可以嘗試讓你知道 – salman

+0

@Mantorok - 這是一個很好的類,但不像你想要的那樣功能全面;)如果它有像​​'AddQueryString(string key,string value)'這樣的東西真的很不錯處理整個「是否有一個查詢字符串集,在這種情況下,我會追加&否則我會用?」。 –

1

我可以建議你看看帶有諸如Fiddler這樣的工具的請求,看看這些重定向來自哪裏,並確實確認RedirectPath確實完全合格嗎?

您應該能夠確認證書是通過HTTPS發送的,然後您將被重定向到(使用302)HTTP。如果您被重定向到HTTPS,那麼很可能是您沒有設置完全限定域名。

另一種選擇是您確實重定向到HTTP頁面,但還有其他內容會強制用戶返回到HTTPS - 例如強制用戶使用HTTPS登錄的機制 - 這是每頁或每個目錄設置?在這種情況下,您會看到一個302到HTTP,然後是另一個302到HTTPS。

0

我遇到了同樣的問題,在我的情況下,它肯定會被負載平衡器重寫。我們使用CoyotePoint的均衡器。我剛剛閱讀了手冊中的以下內容:

在第7層HTTPS羣集中,客戶端使用 HTTPS連接連接到羣集IP。均衡器終止HTTPS連接,並使用HTTP協議與集羣中的服務器進行通信。 默認情況下,Equalizer會檢查http:// URL的服務器響應, 會將它們重寫爲https:// URL,以便這些URL在 客戶端上正常工作。例如,如果服務器使用Location:頭髮送HTTP重定向,則該URL很可能包含http:// 協議。均衡器會重寫此響應,以便URL使用 https://。

顯然,我可以禁用「無頭重寫」來糾正它。

2

這裏是我的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訪問的每個頁面。

1

免責聲明 - 我參與了這個項目

我會建議使用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);