перенаправление с http на https в масштабе всего приложения

#c# #asp.net

#c# #asp.net

Вопрос:

В нашем веб-решении, если для нашего environmentmode установлено значение production, мы хотим перенаправить пользователя на безопасное соединение, если соединение небезопасно.

Если возможно, я бы очень хотел избежать необходимости вызывать эту проверку на каждой странице, поскольку существует сотни страниц.

Есть ли какой-либо способ выполнить это в global.asax? Или любое другое решение для всего приложения?

Я пробовал следующее:

 if (SettingsHandler.EnvironmentMode == EnvironmentModes.Production)
{
    if (!HttpContext.Current.Request.IsSecureConnection)
    {
        HttpContext.Current.Response.Redirect("https://<obscured>");
    }
}
 

о событии begin_request.

Ему удалось определить, является ли соединение безопасным или нет, но перенаправление завершается с ошибкой, и я попадаю на общую страницу с ошибкой «страница не может быть отображена». URL-адрес не преобразуется в клиентском браузере, либо он просто остается на начальной странице, как будто ответ поврежден или сервер по какой-то причине отказывается его доставлять.

Любая помощь была бы очень признательна.

РЕШЕНО: Смотрите мой последний комментарий в принятом ответе о том, почему я его принял.

Комментарии:

1. Звучит забавно, можете ли вы включить Fiddler и посмотреть, возвращает ли сервер заголовок перенаправления 302? Также может быть ответ. Завершается после вашего редиректа.

2. @danswain сервер ничего не возвращал, прежде чем мне удалось это исправить. Это была ошибка на стороне клиента, которая показала, что страница не может быть отображена.

Ответ №1:

Вы могли бы сделать это через IIS. На этой странице показано, как: http://www.sslshopper.com/iis7-redirect-http-to-https.html

Альтернативно вы могли бы использовать global.asax — просто поместите свой код в событие Application_BeginRequest внутри global.asax.

Кстати, я протестировал этот код, и это привело к тому, что любой запрос на мой сайт перенаправлялся на Google через ssl — я подозреваю, что ваше перенаправление может быть в try catch. Если это так, не забудьте использовать синтаксис:

 Response.Redirect("site",true);
 

Вот код, который сработал для меня:-

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Security;
using System.Web.SessionState;

namespace repeater
{
    public class Global : System.Web.HttpApplication
    {

        protected void Application_Start(object sender, EventArgs e)
        {

        }

        protected void Session_Start(object sender, EventArgs e)
        {

        }

        protected void Application_BeginRequest(object sender, EventArgs e)
        {
            Response.Redirect("https://www.google.com");
        }

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {

        }

        protected void Application_Error(object sender, EventArgs e)
        {

        }

        protected void Session_End(object sender, EventArgs e)
        {

        }

        protected void Application_End(object sender, EventArgs e)
        {

        }
    }
}
 

Посмотрите, работает ли упрощение до этого для вас?

Комментарии:

1. Если бы вы потрудились прочитать мой вопрос, вы бы увидели, что ваше более позднее решение — это именно то, что я пробовал. Спасибо, хотя я прочитаю ссылку, которую вы разместили.

2. хм, мне интересно узнать, почему вы получаете сообщение об ошибке — у вас его нет в try catch, не так ли?

3. он не выдает ошибку, страница просто не отображается / не доставляется с этим перенаправлением.

4. Да, и еще, решение по ссылке, которую вы разместили, будет ли оно удобным для searchengine? Очень важно, чтобы редиректы были seo, и если ответ будет 403, я не думаю, что Google это сильно понравится.

5. @Jonas и если бы вы потрудились получить фактическое сообщение об ошибке и опубликовать эту информацию. Есть вероятность, что вы могли бы получить помощь в решении вашей реальной проблемы. Если это стандарт ASP.NET сообщение об ошибке, на которое вы ссылаетесь, затем на странице ошибок написано, как получить фактическое сообщение об ошибке

Ответ №2:

Вы можете сделать это с помощью модуля перезаписи URL-адреса iis.

Просто добавьте следующее в свой web.config в <system.webServer> разделе.

 <rewrite>
  <rules>
    <rule name="HTTP to HTTPS redirect" enabled="true" stopProcessing="true">
      <match url="(.*)"/>
      <conditions>
        <add input="{HTTPS}" pattern="off" ignoreCase="true"/>
      </conditions>
      <action type="Redirect" redirectType="Found" url="https://{HTTP_HOST}/{R:1}"/>
    </rule>
  </rules>
</rewrite>