Токен против подделки веб-сайта ASP.NET MVC 3 не работает только в IE - PullRequest
6 голосов
/ 22 декабря 2011

В моем проекте MVC 3 у меня есть страница входа, которая использует логику защиты от подделки, встроенную в MVC 3.

В Firefox & Opera это работает просто отлично, но в IE я получаю следующее:

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

Я действительно озадачен тем, почему это страдает только в IE, я проверил настройки файлов cookie, и они установлены так же, как и в других браузерах, поэтому я теряюсь здесь.

Когда яиспользуйте код защиты от подделки, я использую и соль, и проверку домена (что не должно иметь значения, но стоит рассказать).

Вот код вида:

@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("!@#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 для легкой настройки во время тестирования и использования в производственной среде.

Если я удаляю часть домена и пути из тега защиты от подделки, все работает нормально.Таким образом, одна из этих двух должна быть проблемой.

Ответы [ 3 ]

5 голосов
/ 22 декабря 2011

У меня была похожая проблема, подобная этой, при использовании собственного создателя токена AntiCSRF. Я не использовал MVC3, но это может быть проблемой для сравнения.

Проблема для меня заключалась в том, что доменное имя, которое я использовал локально для тестирования сайта, содержало подчеркивание. Теоретически DNS-имя не может иметь подчеркивания (даже если «имя компьютера» может), поэтому IE не сохранял куки.

Возможно, это не та же проблема, но может быть что-то, связанное со средой тестирования и с тем, как IE обрабатывает файлы cookie.

Вот очень интересная статья о внутреннем устройстве IE cookie, которая может помочь вам раскрыть проблему.

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

1 голос
/ 21 января 2014

У меня была та же проблема, что и в проекте MVC3, построенном в VS2010 и просмотренном через IE 11 (он отлично работает в Firefox).

Мне удалось обойти это путем добавления cookieless = "UseCookies" к элементу "forms" в файле web.config в корневом каталоге:

<authentication mode="Forms">
  <forms loginUrl="~/Account/LogIn" timeout="2880" slidingExpiration="true" requireSSL="false" cookieless="UseCookies"/>
</authentication>
0 голосов
/ 22 декабря 2011

Не моя любимая идея, но пока я не смог понять это, я вынул параметры домена и пути, что делает IE счастливым.

Если у кого-нибудь есть предложение, я открыт, но пока яЯ согласен, просто засолив токен.

Спасибо всем за помощь.

...