MVC3: Как я могу автоматически направлять запросы без SSL к протоколу SSL? - PullRequest
1 голос
/ 22 декабря 2011

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

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

Ответы [ 2 ]

2 голосов
/ 14 января 2012

Как-то так поможет:

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new HandleErrorAttribute());
        filters.Add(new RequireHttpsAttribute());
    }
1 голос
/ 22 декабря 2011

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

[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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...