#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>