2013-12-04 2 views
1

Я не уверен, что проблема в моем коде или IIS7.5. Если я начну свою сессию, используя https://.../index, а затем нажмите на страницу заказов с атрибутом RequireHttps, сайт будет работать. Однако, если я запустил сеанс в небезопасном режиме, http://../index, я получаю 500 ошибок от IIS.https in MVC4 не работает

Я использую MVC 4, IIS 7.5 и маршруты по умолчанию. Вот заявление в контроллере

#if !DEBUG 
     [RequireHttps] 
#endif 
     [HttpPost] 
     [ValidateAntiForgeryToken] 
     public ActionResult Order() 
     { 
     ... 
     } 

Есть ли что-нибудь еще мне нужно сделать в MVC4 к переходу в течение сеанса в защищенном режиме. Кроме того, есть ли какая-то настройка, которую я должен настроить на IIS?

+0

Я нашел «взломанный», который, кажется, исправить проблему. Я создал метод в моем контроллере, который получает запрос на защищенную страницу. Затем я перенаправляю на защищенную страницу, используя полный url ... https: // ... Чтобы он работал, мне пришлось удалить атрибут HttpPost и AntiForgery. Но как только результаты возвращаются, он снова начинает использовать токен AntiForgery, и каждое действие является действием Post. Его работа, просто надеюсь, что это не создаст проблемы для меня – edepperson

ответ

0

Вот решение, которое я реализовал, на всякий случай, это помогает кому-то другому. Я не предлагаю его как идеальный, но в моем случае этот хак работал.

Как фон, страница, которая вызывает эта форма является SPA, так что здесь сегменты JavaScript, которые делают вызов

... 
$("#mnuorder").click(function (e) { 
    e.preventDefault(); 
    loadwholePage("Home/OrderStage"); 
}); 
... 

function loadwholePage(saction) { 
    if (($("#FName") != undefined) && ($("#FName").length > 0)) { 
     abortValidation(); 
    } 
    $("#frmmaincontainer").attr("action", saction); 
    $("#frmmaincontainer").submit(); 
} 

здесь код позади. Условное значение позволяет мне отлаживать, но при запуске в безопасном режиме. PCODE является для обработки опциона QueryString параметр, который хранится на главной странице

[HttpPost] 
[ValidateAntiForgeryToken] 
public ActionResult OrderStage() 
{ 
    string pcode = Request["txtPromoCode"] ?? ""; 
    if (pcode.Length > 0) 
    { 
     pcode = "?promocode=" + pcode; 
    } 
#if !DEBUG 
    return Redirect("https://.../Home/Order"+pcode); 
#else 
    return Redirect("http://localhost:63583/Home/Order"+pcode); 
#endif 
} 

Наконец, здесь метод GET для заказа. Обратите внимание, что не имеет antiforgerytoken, но когда страница обслуживается, он начинает новую antiforgerytoken, и каждый метод с этого момента является HttpPost

#if !DEBUG 
    [RequireHttps] 
#endif 
    public ActionResult Order(string promocode) 
    { 
     string ipaddr; 
     string binfo; 
     Models.Home.Order vm = new Models.Home.Order(); 
     vm.PromoCode = promocode; 
     vm.ExpMoLst = Models.ExpireMo.GetExpireMo; 
     vm.ExpYrLst = Models.ExpireYr.GetExpireYr; 
     return View("Order", vm); 
    } 

Я знаю, его немного рубить и я уверен, что есть лучшее решение, но, проведя пару часов в поисках, это то, что я придумал. Может быть, это поможет кому-то другому.

Смежные вопросы