MVC3: как я могу автоматически направлять не-SSL-запросы на протокол SSL?

У меня есть сайт, который необходимо защитить с помощью SSL. Как настроить маршрут или конфигурацию IIS, которая будет автоматически отправлять любой запрос, полученный по протоколу, отличному от SSL, по протоколу SSL? Можно ли это обработать как правило маршрутизации, или лучше использовать атрибут RequireHttps в основном контроллере только для методов, а не для самого контроллера, и определить протокол в методе Index()?

В качестве примечания: я прочитал этот вопрос, который использует UrlRewriting и маршрутизацию запросов приложений IIS7, но я застрял с IIS6, и UrlRewriting не подходит для меня.


person Joel Etherton    schedule 22.12.2011    source источник
comment
Не слишком полагайтесь на автоматические перенаправления с http:// на https://: браузер все равно сделает (полный) первоначальный запрос по простому HTTP, прежде чем будет перенаправлен. См.: stackoverflow.com/a/8765067/372643.   -  person Bruno    schedule 14.01.2012
comment
@Bruno: Это серьезная проблема, спасибо, что указали на это. Это не влияет на небольшой сайт, который я создаю, потому что он принимает только сообщения, и единственная страница, к которой когда-либо будет первоначально обращаться по http, будет исходным логином.   -  person Joel Etherton    schedule 14.01.2012
comment
Я бы посоветовал вам не использовать такую ​​логику. Чрезвычайно сложно устоять перед желанием заставить его работать на вас, обойдя различные существующие ограничения. Защищенные данные и незащищенные данные должны быть абсолютно изолированы друг от друга. Все, что использует HTTPS, является безопасным, независимо от того, кажется это так или нет. Все, что использует HTTP, не является по определению... даже зашифрованные данные не защищены по HTTP. При таком использовании туннеля вы открываете брешь в своей безопасности, которую, как вам кажется, вы можете контролировать, но это нарушает принцип, который я изложил выше.   -  person jinzai    schedule 14.09.2016


Ответы (2)


Это то, что мы используем. Хотелось бы услышать, можно ли его улучшить.

[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = false)]
public class EnforceHttpsAttribute : RequireHttpsAttribute
{
    private static bool AuthorizeCore(HttpContextBase httpContext)
    {
        return httpContext.Request.IsSecureConnection;
    }

    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        if (!AuthorizeCore(filterContext.HttpContext))
        {
            HandleNonHttpsRequest(filterContext);
        }
        else
        {
            var cache = filterContext.HttpContext.Response.Cache;
            cache.SetProxyMaxAge(new TimeSpan(0L));
            cache.AddValidationCallback(CacheValidateHandler, null);
        }
    }

    // ReSharper disable RedundantAssignment
    private static void CacheValidateHandler(HttpContext context, object data, ref HttpValidationStatus validationStatus)
    // ReSharper restore RedundantAssignment
    {
        validationStatus = OnCacheAuthorization(new HttpContextWrapper(context));
    }

    private static HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext)
    {
        return !httpContext.Request.IsSecureConnection
            ? HttpValidationStatus.IgnoreThisRequest
            : HttpValidationStatus.Valid;
    }
}

Ответ на комментарий 1

Хороший вопрос, я не уверен. HandleNonHttpsRequest исходит из базового атрибута RequireHttpsAttribute. Я только что провел проверку в fiddler2, и через http был отправлен только 1 запрос. Однако ответ вернулся через https.

Я только что понял, что мы используем вышеизложенное, чтобы заставить RequireHttps работать с выходным кешем. Возможно, вам лучше просто использовать атрибут RequireHttps.

person danludwig    schedule 22.12.2011
comment
Выполняет ли метод HandleNonHttpsRequest перенаправление для вашей или какой-либо другой логики? - person Joel Etherton; 22.12.2011

Что-то вроде этого поможет:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new RequireHttpsAttribute());
    }
person Arash    schedule 14.01.2012