2011-12-22 38 views
7

Trong dự án MVC 3 của tôi có một trang đăng nhập mà sử dụng logic chống giả mạo được xây dựng vào MVC 3.ASP.NET MVC trang 3 web chống giả mạo thẻ không chỉ trên IE

Trên Firefox & Opera nó hoạt động tốt, nhưng trên IE tôi có được điều này:

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

tôi thực sự bối rối về việc tại sao chỉ IE bị này, tôi đã kiểm tra các thiết lập cookie và họ thiết lập tương tự như các trình duyệt khác vì vậy tôi đang ở một bị mất ở đây.

Khi tôi sử dụng mã chống giả mạo, tôi sử dụng cả SALT và kiểm tra miền (điều này không quan trọng nhưng đáng nói).

Đây là mã xem:

@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 là một giá trị từ web.config để cài đặt cho thời gian thử nghiệm và sản xuất sử dụng.

Nếu tôi xóa phần miền và phần đường dẫn khỏi thẻ chống đông, nó hoạt động tốt. Vì vậy, một trong hai điều đó phải là vấn đề.

+1

Bạn có thể gửi mã xem của bạn ? –

+0

Xin chào, bạn đang sử dụng phiên bản IE nào? –

+0

Bạn có thể (hoặc sử dụng công cụ dev của IE, Firebug Lite hoặc Fiddler) tìm hiểu xem yêu cầu 'POST' của bạn có đang gửi cookie AntiForgery trở lại không? – isNaN1247

Trả lời

0

Không ý tưởng yêu thích của tôi, nhưng cho đến khi tôi có thể con số này ra tôi lấy ra các thông số miền và đường dẫn mà làm cho IE hạnh phúc.

Nếu có ai có đề xuất, tôi sẽ mở cửa, nhưng bây giờ tôi sẽ giải quyết chỉ bằng cách đánh dấu mã thông báo.

Cảm ơn mọi người đã giúp đỡ của bạn.

+0

Bạn có thể giải thích ý của mình bằng cách lấy các tham số miền và đường dẫn không? Về những gì? Tôi đang gặp sự cố này và tôi không thể giải quyết vấn đề này cho đến thời điểm này. – Termato

+1

trên bộ điều khiển, bạn có thể đặt tên miền thông qua thuộc tính, tôi đã xóa nó khỏi đó. Tôi muốn đăng mã nhưng ứng dụng này đã được thực hiện cách trở lại và tôi đã kể từ khi chuyển từ nó. – Eman

6

Tôi gặp sự cố tương tự như thế này khi sử dụng trình tạo mã thông báo AntiCSRF tùy chỉnh. Tôi đã không sử dụng MVC3 nhưng nó có thể là một vấn đề similer.

Vấn đề đối với tôi là tên miền tôi đang sử dụng cục bộ để kiểm tra trang web có dấu gạch dưới trong đó. Về lý thuyết, một tên DNS không thể có một dấu gạch dưới (mặc dù một "tên máy tính" có thể), vì vậy IE không lưu các cookie.

Nó có thể không phải là cùng một vấn đề, nhưng có thể là một cái gì đó liên quan đến một môi trường thử nghiệm và cách cookie bị hanlded bởi IE.

Đây là một bài viết rất thú vị về nội bộ của xử lý cookie IE có thể giúp bạn phát hiện vấn đề.

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

+0

tên miền của tôi chỉ là localhost trong khi thử nghiệm. – Eman

+1

@ php-jquery-programmer cũng rất đáng để bắn. Bạn có thể thấy liên kết hữu ích, nó có rất nhiều mẹo hữu ích khác. –

1

Tôi đã có cùng một vấn đề như thế này trong một dự án MVC3 được xây dựng trong VS2010 và xem qua IE 11 (nó hoạt động tốt trong Firefox).

Cách mà tôi quản lý để có được xung quanh nó là bằng cách thêm cookie = "UseCookies" vào yếu tố "hình thức" trong file web.config trong thư mục gốc:

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

Tôi đang sử dụng MVC4 trong VS2012 và xem trong IE10. Điều này dường như không hiệu quả với tôi. Bạn có biết tại sao điều này sẽ không hoạt động? Đó là một bộ não thực sự. – Termato

+0

Tôi chưa thực hiện bất kỳ công việc nào với MVC4 và VS2012 vì vậy tôi không biết liệu nó có xử lý điều này theo một cách khác hay không. Một thứ khác mà bạn có thể thử là đảm bảo rằng người dùng cho phép cookie được chấp nhận cho trang web của bạn để mã thông báo chống giả mạo hoạt động. – Ally

Các vấn đề liên quan