我不确定问题是我的代码还是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上配置一些设置吗?
答案 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);
}
我知道,它有点像黑客,我确信有一个更好的解决方案,但是花了几个小时看,这就是我想出来的。也许它会帮助别人。