MVC4中的https不起作用

时间:2013-12-04 14:22:43

标签: asp.net asp.net-mvc asp.net-mvc-4 iis iis-7.5

我不确定问题是我的代码还是IIS7.5。如果我使用https://.../index启动会话,然后单击具有RequireHttps属性的订单页面,则该站点可以正常运行。但是,如果我以非安全模式http://../index启动会话,则会从IIS收到500错误。

我正在使用MVC 4,IIS 7.5和默认路由。以下是控制器中的声明

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

在MVC4中我还需要做些什么来在会话中转换到安全模式。另外,我应该在IIS上配置一些设置吗?

1 个答案:

答案 0 :(得分: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用于处理存储在主页上的选项查询字符串参数

[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);
    }

我知道,它有点像黑客,我确信有一个更好的解决方案,但是花了几个小时看,这就是我想出来的。也许它会帮助别人。