Мое веб-приложение перенаправляется в безопасное, и я не могу остановить его
У меня есть приложение MVC4. На моем базовом контроллере у меня есть условное перенаправление для безопасного WebPageRequireHttpsAttribute
когда нет в DEBUG, что все остальные контроллеры, обслуживающие страницы, наследуются так:
#if !DEBUG
[WebPageRequireHttps]
#endif
public abstract class SecureController : Controller
{
...
мой WebPageRequireHttpsAttribute
определяется так:
[SuppressMessage("Microsoft.Performance", "CA1813:AvoidUnsealedAttributes",
Justification = "Unsealed because type contains virtual extensibility points.")]
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class WebPageRequireHttpsAttribute : FilterAttribute, IAuthorizationFilter
{
public virtual void OnAuthorization(AuthorizationContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (!filterContext.HttpContext.Request.IsSecureConnection)
{
HandleNonHttpsRequest(filterContext);
}
}
protected virtual void HandleNonHttpsRequest(AuthorizationContext filterContext)
{
// only redirect for GET requests, otherwise the browser might not propagate the verb and request
// body correctly.
if (!String.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
throw new InvalidOperationException(
"Only redirect for GET requests, otherwise the browser might not propagate the verb and request body correctly.");
}
// redirect to HTTPS version of page
if (filterContext.HttpContext.Request.Url == null) return;
var url = "https://" + filterContext.HttpContext.Request.Url.Host + filterContext.HttpContext.Request.RawUrl;
filterContext.Result = new RedirectResult(url, true);
}
Вот и все. Это единственный момент, когда перенаправление выполняется для веб-страниц (у меня есть что-то похожее для страниц веб-страниц).
На моем сайте в режиме DEBUG с установленной константой DEBUG меня перенаправляют на страницу HTTPS, которой, разумеется, нет в моем устройстве dev, и я абсолютно не могу понять, почему. Я закомментировал атрибут, я даже удалил класс, и он все еще перенаправляется. Я тяну свои волосы здесь.
Может в IIS Express что-то странное кешируется? Может ли он применять атрибут redirect в качестве фильтра для всех запросов независимо от того, вызывается он или нет? Это сводит меня с ума.
2 ответа
Хорошо, ответ не имеет ничего общего с Visual Studio, C# или ASP.NET MVC... скорее мой браузер по умолчанию, а именно Chrome. Я отправлял 301 (постоянное перенаправление), и Chrome кешировал это. При нормальных обстоятельствах это было бы хорошо; для разработки, не так много.
Чтобы удалить кэшированное перенаправление из Chrome, я открыл параметры Chrome, Настройки, нажал "Показать дополнительные настройки". В разделе "Конфиденциальность" я нажал кнопку "Очистить данные браузера..." и проверил следующие параметры:
- Очистить историю браузера
- Очистить историю загрузок
- Удалить куки и другие данные сайта и плагина
- Очистить кэш
и установите период раскрытия для 1 недели. Затем я снова нажал кнопку "Очистить данные просмотра".
Я почти уверен, что мне нужен был только один из этих вариантов, но я был слишком разочарован этой досадной проблемой, что я использовал подход дробовика. Однако это сработало.
Global.asax.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new RequireHttpsAttribute()); // <----
}
Я включил HTTPS/SSL во многих приложениях, используя этот подход.
Ну вот, надеюсь, это поможет.