MVC3 AntiForgeryToken ломается при входе в систему Ajax

ASP.NET MVC AntiForgeryToken механизм основан на текущем HttpContext.User . Он использует это значение для создания токена, когда вы вызовите Html.AntiForgeryToken () . В основном это нормально (см. объяснение в последнем абзаце здесь ), но проблема возникает, когда вы входите в систему через вызов Ajax .

В моем коде, когда пользователь входит в систему, учетные данные отправляются как объект Json в Ajax (значение скрытого поля AntiForgeryToken также отправляется внутри Json), сервер аутентифицирует пользователя. , применяет FormsAuthentication.SetAuthCookie () и возвращает результат Json, который содержит некоторые пользовательские данные.Таким образом, я могу избежать полного обновления страницы при входе в систему.

Проблема в том, что каждый последующий запрос Ajax к серверу теперь завершается ошибкой ValidateAntiForgeryTokenAttribute , потому что теперь ожидается токен защиты от подделки, несовместимый с файлом cookie защиты от подделки.

Как я могу получить действующий токен защиты от подделки, который нужно вставить в скрытое поле клиента, чтобы каждый запрос Json после входа в систему выполнялся успешно?

Я попытался получить новый токен скрытого поля вручную (с помощью AntiForgery. GetHtml () в действии, извлекая саму строку токена, возвращая ее клиенту в Json и помещая ее в скрытое поле защиты от подделки вручную в JavaScript), но это не работает - последующий вызов Ajax завершается ошибкой ValidateAntiForgeryTokenAttribute на сервере. Фактически, каждый вызов AntiForgery.GetHtml () (который, по сути, является помощником Html.AntiForgeryToken () действительно) создает другой токен, который делает недействительным предыдущий.

Я также пытался установить HttpContext.User = new GenericPrincipal (new GenericIdentity (email), null); , как подробно описано здесь , но это не сработало.

Примечание: Это решение не работает для меня из-за моей конкретной ситуации: логин Ajax , который изменяет личность пользователя на сервере и, следовательно, каждый токен, который был сгенерирован до того, как логин недействителен; это решение также неприменимо, поскольку оно решает другую проблему.

8
задан Community 23 May 2017 в 12:08
поделиться