Мое веб-приложение перенаправляется в безопасное, и я не могу остановить его

У меня есть приложение 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 во многих приложениях, используя этот подход.

Ну вот, надеюсь, это поможет.

Другие вопросы по тегам