2011-12-22 3 views
7

실패 잘하지만, IE에 난이 얻을 :ASP.NET MVC 3 웹 사이트 위조 방지 토큰은 내가 그것을 작동 파이어 폭스 & 오페라에 MVC 3</p> <p>에 내장 된 위조 방지 로직을 사용하는 로그인 페이지가 내 MVC 3 프로젝트에서 유일한 IE

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

내가 정말에만 IE는이 고통 이유에 난처한 해요를, 나는 쿠키 설정을 확인하고 다른 브라우저 그래서 난에있어 그들이 설정 동일 여기에서 길을 잃었 어.

위조 방지 코드를 사용할 때 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

당신이보기 코드를 게시 할 수 :

나는 그것을 해결하기 위해 관리하는 방법은 루트 디렉토리에 web.config 파일에서 "형식"요소에 쿠키 = "UseCookies"를 추가했다 ? –

+0

안녕하세요, IE의 어떤 버전을 사용하고 있습니까? –

+0

(IE의 개발 도구, Firebug Lite 또는 Fiddler를 사용하여)'POST' 요청이 AntiForgery 쿠키를 다시 보내고 있는지 확인할 수 있습니까? – isNaN1247

답변

0

하지 나의 마음에 드는 생각은,하지만 난 IE 행복하게 도메인과 경로 매개 변수를했다.

누군가가 제안을했다면 열어 보았지만 지금은 토큰을 소금물에 담그면 해결할 것입니다.

모두에게 감사드립니다.

+0

당신은 도메인과 경로 매개 변수를 꺼내서 무슨 뜻인지 설명 할 수 있습니까? 에 무슨? 나는이 문제가있어 지금까지 해결할 수 없습니다. 컨트롤러에 – Termato

+1

, 당신은 속성을 통해 도메인을 설정할 수 있습니다, 나는 거기에서 그것을 제거했습니다. 코드를 게시 하겠지만이 앱은 원래대로 돌아 왔고 그 이후로 옮겼습니다. – Eman

6

커스텀 AntiCSRF 토큰 작성자를 사용할 때 비슷한 문제가 발생했습니다. 나는 MVC3을 사용하지 않았지만 그것은 similer 문제일지도 모른다.

나를 위해 문제는 내가 사이트를 테스트하기 위해 로컬로 사용하고있는 도메인 이름에 밑줄이 있다는 것이 었습니다. 이론상 DNS 이름에는 밑줄 ("컴퓨터 이름"이 있더라도)을 사용할 수 없으므로 IE는 쿠키를 저장하지 않습니다.

동일한 문제는 아니지만 테스트 환경 및 쿠키가 IE에 의해 hanlded되는 방식과 관련 될 수 있습니다.

다음은이 문제를 발견하는 데 도움이되는 IE 쿠키 처리의 내부에 대한 매우 흥미로운 기사입니다. 나는이 알아낼 수있을 때까지

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

+0

내 도메인은 테스트 중에 localhost입니다. – Eman

+1

@ php-jquery-programmer 오 가치가 있습니다. 링크를 통해 도움이 될만한 정보를 얻을 수 있습니다. –

1

VS2010에 내장 된 MVC3 프로젝트에서이 문제와 동일한 문제가 있었으며 IE 11을 통해 보았습니다 (Firefox에서는 잘 작동합니다).

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

VS2012에서 MVC4를 사용하고 IE10에서보고 있습니다. 이것은 나를 위해 작동하지 않는 것 같습니다. 왜 이것이 작동하지 않는지 아십니까? 진짜 두뇌 트위스터 야. – Termato

+0

아직 MVC4와 VS2012에서 어떤 작업도하지 않았기 때문에 다른 방식으로 처리하는지 알 수 없습니다. 위조 방지 토큰이 작동하려면 사용자가 쿠키를 웹 사이트에 허용하도록 허용해야합니다. – Ally