2013-07-04 3 views
0

Я хочу перенаправить страницу на безопасное соединение для ASPX-файла.ASP.Net Перенаправление для обеспечения безопасности

Клиентам предлагается скопировать и вставить URL-адрес, который выглядит так: foo.com.au в браузер.

У меня есть этот код, работающий на коде позади файла, но мне интересно, когда он развернут на производство, если это будет обновить URL, чтобы иметь www после https://www как URL предоставляется клиентам не www в нем?

protected override void OnPreInit(EventArgs e) 
    { 
     base.OnPreInit(e); 
     if (!Request.IsLocal && !Request.IsSecureConnection) 
     { 
      string redirectUrl = Request.Url.ToString().Replace("http:", "https:"); 
      Response.Redirect(redirectUrl); 
     } 
    } 

ответ

2

Вместо использования Request.Url используйте Request.Url.AbsoluteUri. Кроме того, вы не должны предполагать, что URL-адрес будет введен в нижнем регистре. Я бы пересмотрел код:

if (!Request.IsLocal && !Request.IsSecureConnection) 
{ 
    if (Request.Url.Scheme.Equals(Uri.UriSchemeHttp, StringComparison.InvariantCultureIgnoreCase)) 
    { 
     string sNonSchemeUrl = Request.Url.AbsoluteUri.Substring(Uri.UriSchemeHttp.Length); 
     // Ensure www. is prepended if it is missing 
     if (!sNonSchemeUrl.StartsWith("www", StringComparison.InvariantCultureIgnoreCase)) { 
      sNonSchemeUrl = "www." + sNonSchemeUrl; 
     } 
     string redirectUrl = Uri.UriSchemeHttps + sNonSchemeUrl; 
     Response.Redirect(redirectUrl); 
    } 
} 

Если вы сделаете это, все, что он изменит, это схема. Таким образом, если absoluteUri является

http://foo.com.au 

будет изменено на

https://foo.com.au 

последнее замечание: когда мы сделали это, мы никогда не пробовали его в OnPreInit, мы всегда выполнять эту логику в Page_Load , Я не уверен, какие, если таковые имеются, последствия будут перенаправлены на эту часть жизненного цикла страницы, но если у вас возникнут проблемы, вы можете переместить их в Page_Load.

+0

Спасибо, последняя часть удостоверяется 'www' помещается в URL (если она не существует) поскольку сертификат предназначен для 'https: // www.foo.com.au', а не' https: // foo.com.au' @competent_tech – ojhawkins

+0

Я не уверен на 100%, что это необходимо, но это должно быть простой тест URI, чтобы узнать, начинается ли он с www и добавляет его, если нет. Я могу пересмотреть ответ, чтобы показать это. –

+0

@ojhawkins: ok, ответ был изменен, чтобы включить добавление www. если он отсутствует. –

0

Это было мое окончательное внедрение для учета запроса проступает для https://foo и не https://www.foo

 if (!Request.IsLocal && 
      !Request.Url.AbsoluteUri.StartsWith("https://www.", StringComparison.OrdinalIgnoreCase)) 
     { 
      string translatedUrl; 
      string nonSchemeUrl = Request.Url.AbsoluteUri; 
      string stringToReplace = (Request.Url.Scheme == Uri.UriSchemeHttp ? Uri.UriSchemeHttp + "://" : Uri.UriSchemeHttps + "://"); 
      nonSchemeUrl = nonSchemeUrl.Replace(stringToReplace, string.Empty); 
      if (!nonSchemeUrl.StartsWith("www", StringComparison.InvariantCultureIgnoreCase))nonSchemeUrl = "www." + nonSchemeUrl; 
      translatedUrl = Uri.UriSchemeHttps + "://" + nonSchemeUrl; 
      Response.Redirect(nonSchemeUrl); 
     } 
+0

вы никогда не используете переменную translUrl –

Смежные вопросы