2011-12-22 29 views
7

失敗在我的MVC 3的項目我有一個使用內置MVC 3ASP.NET MVC 3網站防僞標記只在IE

在Firefox &歌劇的防僞邏輯它的工作原理登錄頁面不錯,但在IE上我得到這個:

A required anti-forgery token was not supplied or was invalid. 

我真的難倒爲什麼只有IE遭受此,我查了cookie設置以及它們設置一樣的其他瀏覽器,所以我在迷失在這裏。

當我使用防僞代碼時,我使用了SALT和域名檢查(這應該不重要,但值得一說)。

這裏是視圖代碼:

@model login.Models.LogOnModel 

@{ 
    ViewBag.Title = "Log On"; 
} 

<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"> </script> 
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 

<script type="text/javascript"> 
$(function() { 
    //focus on form. 
    $("#UserName").focus(); 
}); 
</script> 

@using (Html.BeginForm("LogOn", "Account", FormMethod.Post, new { @class = "form login" })) { 
@Html.AntiForgeryToken("[email protected]#Hq4(", ViewBag.AppDomain, "/") 
<div id="box"> 
<h1>Login</h1> 
Please enter your username and password. @Html.ActionLink("Register", "Register") if you don't have an account. 
<div class="block" id="block-login"> 
    <h2> 
     Login Form</h2> 
    <div class="content login"> 
       @Html.ValidationSummary(true) 
     <div class="group buffer"> 
      <div class="left"> 
       <label class="label right"> 
        @Html.LabelFor(m => m.UserName)</label> 
      </div> 
      <div class="right"> 
       @Html.TextBoxFor(m => m.UserName, new { @class = "text_field" }) 
       @Html.ValidationMessageFor(m => m.UserName) 
      </div> 
     </div> 
     <div class="group buffer"> 
      <div class="left"> 
       <label class="label right"> 
        @Html.LabelFor(m => m.Password)</label> 
      </div> 
      <div class="right"> 
       @Html.PasswordFor(m => m.Password, new { @class = "text_field" }) 
       @Html.ValidationMessageFor(m => m.Password) 
      </div> 
     </div> 
     <div class="group buffer"> 
      <div class="left"> 
       <label class="label right"> 
        @Html.LabelFor(m => m.RememberMe)</label> 
      </div> 
      <div class="right"> 
       @Html.CheckBoxFor(m => m.RememberMe) 
      </div> 
     </div> 
     <div class="group navform buffer"> 
      <div class="right"> 
       <button class="button" type="submit"> 
        <img src="@Url.Content("~/Content/images/icons/key.png")" alt="Save" /> 
        Login 
       </button> 
      </div> 
     </div> 
    </div> 
</div> 
</div> 
} 

ViewBag.AppDomain是從web.config中用於在測試和生產使用容易設置的值。

如果我從防僞標記中刪除了域和路徑部分,它就可以正常工作。所以這兩個中的一個就是問題所在。

+1

您可以發佈您的視圖代碼? – 2011-12-22 15:45:48

+0

嗨,你使用的是什麼版本的IE? – 2011-12-22 16:08:42

+0

你能夠(使用IE的開發工具,Firebug Lite或Fiddler)找出你的'POST'請求​​是否發回AntiForgery cookie? – isNaN1247 2011-12-22 16:09:37

回答

0

不是我喜歡的想法,但直到我可以算出來我拿出這使得IE快樂的域和路徑參數。

如果有人有一個建議,我是開放的,但現在我會解決只是醃製令牌。

謝謝大家的幫助。

+0

你能解釋一下你的意思嗎?拿出域和路徑參數?什麼?我遇到此問題,目前無法解決此問題。 – Termato 2014-03-14 16:03:14

+1

在控制器上,您可以通過屬性設置域,我從那裏刪除它。我會發布代碼,但是這個應用程序已經回到了原來的狀態,之後我就開始了。 – Eman 2014-03-14 16:40:41

6

當使用自定義AntiCSRF令牌創建器時,我遇到了類似的問題。我沒有使用MVC3,但它可能是一個模擬器問題。

這個問題對我來說是我在本地用於測試網站的域名有一個下劃線。從理論上講,DNS名稱不能有下劃線(即使「計算機名稱」可以),所以IE不保存cookie。

它可能不是同一個問題,但可能是與測試環境相關的東西以及cookie由IE提供的方式。

這是一篇非常有趣的關於IE cookie處理內部的文章,可以幫助你發現問題。

http://blogs.msdn.com/b/ieinternals/archive/2009/08/20/wininet-ie-cookie-internals-faq.aspx

+0

我的域名在測試過程中只是localhost。 – Eman 2011-12-22 16:17:24

+1

@ php-jquery-programmer哦,值得一試。您可能會發現該鏈接有幫助,它有一大堆其他有用的提示。 – 2011-12-22 16:25:11

1

我在VS2010中構建的MVC3項目中遇到了同樣的問題,並且通過IE 11查看(它在Firefox中正常工作)。

,我設法繞過它的方式是通過在根目錄下的web.config文件中添加無Cookie =「UseCookies」的「形式」元素:

<authentication mode="Forms"> 
    <forms loginUrl="~/Account/LogIn" timeout="2880" slidingExpiration="true" requireSSL="false" cookieless="UseCookies"/> 
</authentication> 
+0

我在VS2012中使用MVC4並在IE10中查看。這似乎不適用於我。你知道爲什麼這不起作用嗎?這是一個真正的腦筋急轉彎。 – Termato 2014-03-14 16:01:20

+0

我還沒有做過MVC4和VS2012的任何工作,所以我不知道它是否以不同的方式處理這個問題。 您可以嘗試的其他方法是確保用戶允許Cookie爲您的網站接受,以使防僞標記正常工作。 – Ally 2014-03-24 13:30:39